在 Unity 中组合大量网格
Combining large number of meshes in Unity
我将生成的 MRT 扫描 3d 模型导入到 Unity 中。不幸的是,该模型被导入到构成整个模型的许多切片中。
层次结构是这样的:
正如您想象的那样,它会占用大量资源并减慢进一步的处理速度。所以我想把"default"的children(default_MeshPart0,default_MeshPart1,...)合并成一个网格。我发现 Mesh Combine Wizard 非常适合 objects,只有几个 children,但它不适用于 children 这样的大量网格。我试图将一些 children 移动到另一个 parent 文件夹中,然后将它们分开组合以稍后组合新的 parent 文件夹,但这也不起作用,因为我得到了一个随机外观的网格。
你知道如何解决这个问题,或者你能推荐我另一个过程吗?
如果它是为Unity3D创建的,应该没有问题。无论如何,如果您想要单个网格,您将需要一个 3D 建模工具来组合它,然后根据 here 中解释的统一指南以 FBX 格式导出。希望对你有帮助。
组合网格实际上非常简单(我会在一分钟内 运行 你完成),但是有一个问题 - 虽然它在 运行 时间内很容易做到,但我已经在尝试将生成的网格作为硬文件资产可靠地保存到磁盘时遇到了一些问题。我最终没有到达那里,但它比看起来更棘手。如果您可以在 Start() 中完成此操作,则无需保存您的资产,并且您可以在编辑模式下进行操作,但生成的网格不会自动与场景一起保存 - 请记住这一点.
回到几何——几何由三个数组组成
Vector3[] verts;
Vector2[] uv;
int[] triangles;
唯一需要考虑的是,如果你有 n 个顶点,uv[n] 和 vector3[n] 描述 n-th 个顶点(显然),三角形数组是 3*n,并且包含指向顶点 table 的索引,它按顺序排列,所以如果你想找到三角形 k 你读
x=triangles[k*3]
y=triangles[k*3+1]
z=triangles[k*3+2]
并且你的三角形由三个向量 verts[x]、verts[y]、verts[z] 定义。
还有子网格,当一个网格包含多个 material 时使用,但是一旦你知道上面的结构是如何布局的,它并不复杂。
共同创建一个新网格,首先到 GetComponentsInChildren,然后获取所有网格的列表,计算总顶点数 j。
创建一个新的 Mesh 对象,用 tables verts = new int[j], tris = new int[j*3] 初始化它,而不是只复制所有顶点数据。一旦你有了网格,创建一个带有网格过滤器和网格渲染器的新对象,用它来填充网格,你就完成了。问题是除非您保存资产,否则这将在播放模式状态下消失,但这是一个单独的问题
如果你有子网格,你需要列出所有存在的 materials 并按使用的 material 对顶点进行分组(子组 = 使用单个 material 的组),除了管理另一个列表之外,这并不难(如果您忽略该步骤,也不会发生什么可怕的事情,您只会得到一个实体对象),这在大多数情况下对性能非常有用,因为您的对象将是一个不依赖的绘制调用关于动态批处理)
也许你需要做一些post-scan process
。
尝试:
- 在 Maya、3D Max 或 Blender 等
3d software
中打开扫描模型。
Attach
或 Merge
所有部分在一起。
- 将其导出为
.fbx
。
- 将其导入 Unity。
- 在 Unity 中将是
single gameObject
。
我将生成的 MRT 扫描 3d 模型导入到 Unity 中。不幸的是,该模型被导入到构成整个模型的许多切片中。 层次结构是这样的:
正如您想象的那样,它会占用大量资源并减慢进一步的处理速度。所以我想把"default"的children(default_MeshPart0,default_MeshPart1,...)合并成一个网格。我发现 Mesh Combine Wizard 非常适合 objects,只有几个 children,但它不适用于 children 这样的大量网格。我试图将一些 children 移动到另一个 parent 文件夹中,然后将它们分开组合以稍后组合新的 parent 文件夹,但这也不起作用,因为我得到了一个随机外观的网格。 你知道如何解决这个问题,或者你能推荐我另一个过程吗?
如果它是为Unity3D创建的,应该没有问题。无论如何,如果您想要单个网格,您将需要一个 3D 建模工具来组合它,然后根据 here 中解释的统一指南以 FBX 格式导出。希望对你有帮助。
组合网格实际上非常简单(我会在一分钟内 运行 你完成),但是有一个问题 - 虽然它在 运行 时间内很容易做到,但我已经在尝试将生成的网格作为硬文件资产可靠地保存到磁盘时遇到了一些问题。我最终没有到达那里,但它比看起来更棘手。如果您可以在 Start() 中完成此操作,则无需保存您的资产,并且您可以在编辑模式下进行操作,但生成的网格不会自动与场景一起保存 - 请记住这一点.
回到几何——几何由三个数组组成
Vector3[] verts;
Vector2[] uv;
int[] triangles;
唯一需要考虑的是,如果你有 n 个顶点,uv[n] 和 vector3[n] 描述 n-th 个顶点(显然),三角形数组是 3*n,并且包含指向顶点 table 的索引,它按顺序排列,所以如果你想找到三角形 k 你读
x=triangles[k*3]
y=triangles[k*3+1]
z=triangles[k*3+2]
并且你的三角形由三个向量 verts[x]、verts[y]、verts[z] 定义。
还有子网格,当一个网格包含多个 material 时使用,但是一旦你知道上面的结构是如何布局的,它并不复杂。
共同创建一个新网格,首先到 GetComponentsInChildren,然后获取所有网格的列表,计算总顶点数 j。 创建一个新的 Mesh 对象,用 tables verts = new int[j], tris = new int[j*3] 初始化它,而不是只复制所有顶点数据。一旦你有了网格,创建一个带有网格过滤器和网格渲染器的新对象,用它来填充网格,你就完成了。问题是除非您保存资产,否则这将在播放模式状态下消失,但这是一个单独的问题
如果你有子网格,你需要列出所有存在的 materials 并按使用的 material 对顶点进行分组(子组 = 使用单个 material 的组),除了管理另一个列表之外,这并不难(如果您忽略该步骤,也不会发生什么可怕的事情,您只会得到一个实体对象),这在大多数情况下对性能非常有用,因为您的对象将是一个不依赖的绘制调用关于动态批处理)
也许你需要做一些post-scan process
。
尝试:
- 在 Maya、3D Max 或 Blender 等
3d software
中打开扫描模型。 Attach
或Merge
所有部分在一起。- 将其导出为
.fbx
。 - 将其导入 Unity。
- 在 Unity 中将是
single gameObject
。