我工作中的任务经常涉及到在运行时处理网格。例如,模拟液体中漂浮的物体,我们使用平面切割网格,计算子体积和质心,分解为凸碰撞器,然后交付给物理引擎。

我也在个人项目和工作中使用了procedural技术,特别是在pro DCC软件包中。考虑到Houdini、Blender Geometry Nodes、Substance和UE Blueprints的发展趋势,procedural和基于节点的技术正在增长。我想尝试在Unity中实现类似的技术,但以实时优先。

数据模型有四个域:

  • 详细 - 整个几何体作为一个单元。
  • 原型 -实际的多边形,不是三角形。
  • - 在空间中的一个位置。
  • 顶点 - (点,原型) 的绑定。

属性存储在它们语义上属于的地方。例如,位置存储在点上,法线和UV存储在顶点上,材料存储在原型上。拓扑结构在每个操作中保持第一类。

基础层是兼容Burst的代码。热路径使用并行作业。

目前工作的功能:

  • NativeDetail - 完全本机容器,零托管代码。任何可以转换的类型作为属性存储在任何域上。
  • Provenance - 每个输出元素都知道其来源输入和权重,因此属性在拓扑结构变化时不会丢失。新点不会破坏UV。
  • 生成器和拓扑操作,所有 Burst作业 - Box, UV Sphere, Torus, Tube, Cylinder; Plane Cut, Weld, Triangulate, Extrude/Inset, Blast, Recompute Normals。
  • 空间树 - BVH, KD-tree, Octree,已实现多边形射线检测和半径点查询。
  • 打包原型 - 一个原型可以是另一个详细信息的实例,其自己的变换。嵌套预设在数据格式级别上,准备用于GPU实例化。
  • 节点编辑器在Unity的新图表工具上。执行是我的:拉取烘烤(只计算输出需要的内容)加上推送脏(编辑标记依赖项为过时)。
  • ,使用谓词表达式如“每隔一个多边形从1到16”或“A和B的并集,然后反转”。
  • 自定义脚本节点 - 用户C#代码,具有任意输入和输出,外部贡献者扩展API。
  • 每个节点预览固定,加上一个调试查看器,显示拓扑结构,点和多边形索引。
  • Unity Mesh/NativeDetail 两向转换。运行时输出和烘烤到Mesh暴露。

最近一个半月主要稳定了核心API - 我重写了架构五次。短期目标:完成组系统,添加一个小型数学表达式解析器,然后发布一个可展示的示例 - 散布在地形上的树生成器,或者动态碰撞器生成器。