在Unity

时间:2018-03-17 15:48:39

标签: c# unity3d 3d mesh

我将生成的三维MRT扫描模型导入Unity。不幸的是,模型被导入到构成整个模型的许多切片中。 层次结构是这样的:

enter image description here

你可以想象它需要大量的资源并且会减慢进一步的流程。所以我想将“default”的子项(default_MeshPart0,default_MeshPart1,...)组合成一个网格。我发现Mesh Combine Wizard对于只有少数孩子的物体非常有效,但是对于孩子来说它不适用于大量的网格物体。我试图将一些孩子移动到另一个父文件夹并将它们分开组合以便稍后组合新的父文件夹,但这不起作用,因为我有一个随机的网状物。 你知道如何解决这个问题,还是你推荐我另一个过程?

3 个答案:

答案 0 :(得分:1)

组合网格实际上非常简单(我会在一分钟内让你完成),然而有一些问题 - 虽然在运行时很容易做到,但我在尝试可靠保存方面遇到了一些问题生成的网格作为磁盘的硬文件资产。我最后到达那里但它比看起来更棘手。如果您在Start()中完成此操作,则不需要保存资源,并且可以在编辑模式下执行此操作,但生成的网格不会自动保存在场景中 - 只需要有一些内容记住。

返回几何 - 几何由三个数组组成

Vector3[] verts;
Vector2[] uv; 
int[] triangles; 

唯一可以解决的问题是,如果你有n个顶点,uv [n]和vector3 [n]描述第n个顶点(显然),三角形数组是3 * n,并且包含引用的索引顶点表,它按顺序排列,所以如果你想找到三角形k,你可以阅读

x=triangles[k*3] 
y=triangles[k*3+1] 
z=triangles[k*3+2]

并且你的三角形由三个矢量verts [x],verts [y],verts [z]定义。

还有一些子网格,当网格包含多种材质时使用,但一旦你知道上面的结构是如何布局的,它就不复杂了。

为GetComponentsInChildren创建一个新网格,然后获取所有网格的列表,计算总顶点数j。 创建一个新的Mesh对象,用表verts = new int [j],tris = new int [j * 3]初始化它,然后只复制所有顶点数据。获得网格后,使用网格过滤器和网格渲染器创建一个新对象,使用它提供网格并完成。问题是除非你保存资产但这是一个单独的问题,否则这将在播放模式状态下消失

如果你有子网,你需要列出所有存在的材料和按所用材料分组的对象(子组=使用单一材料的grup),除了管理另一个列表之外,这不是更难(和如果忽略这一步,没有什么可怕的事情,你只会得到一个单一的实体对象),这对于大多数情况下的性能都很好,因为你的对象将是一个不依赖于动态批处理的单个drawcall)

答案 1 :(得分:1)

也许你需要做一些recyclerview.setFocusable(false);

尝试:

  • 在Maya,3D Max或Blender等post-scan process中打开扫描模型。
  • 3d softwareAttach所有部分在一起。
  • 将其导出为Merge
  • 将其导入Unity。
  • 在Unity中将是.fbx

答案 2 :(得分:0)

如果为Unity3D创建它不应该是问题。无论如何你想要单个网格,你需要一个3D建模工具来组合它,然后根据统一指南导出FBX格式,如here所述。我希望它可以帮助你。