您的位置:首页 > 移动开发 > Unity3D

在Unity中用脚本根据mesh是否连接分离mesh

2018-02-08 13:53 525 查看
接收一个有几个圆球的模型,用代码将模型分开,并将小球的模型原点变为自己的中心。举个例子:输出一个如下图的模型


输出五个如下图的模型



但是,我这个功能模型设为他们中心只对规则几何模型有效果,因为我是算所有的顶点的平均值来得出他们新的原点的。功能大概就介绍到这里。接下来我们要分几步来解释如何实现它。

一.模型的数据结构

模型文件中有两个重要的数据结构vertices 和 indexes两个数组,vertices 一个代表顶点坐标,indexes里面的数字代表vertices 数组里的索引,每三个数看作一个三角形。vertices {vertex0,vertex1……vertexN}indexes{0,1,2,0,3,4…… }好了,将讲到这了……

二.如何根据连接性分离模型

1.分离mesh分离mesh其实很简单,我用两张图表示将


的数据结构vertices {vertex0,vertex1,vertex2,vertex3,vertex4,vertex5}indexes{0,1,2,3,4,5}变为vertices1 {vertex0,vertex1,vertex2}vertices2 {vertex3,vertex4,vertex5}indexes1 {0,1,2}indexes2 {3,4,5}//我感觉变成indexes2 {0,1,2}比较好,毕竟是一个新的mesh了就可以了。2.根据连接性分离模型如何判断两个mesh是否有连接性其实很简单。只需要遍历之前的三角面判断三角面们之间有没有共用一个顶点就可以了。a.根据这个思路,将indexes分成不同的数组。类似这种(部分思路无法运行的)
for (int i = 0; i < 3; i++)
{
newIndices.Add(restIndices[i]);
}
for (int i = 1; i < restIndices.Count / 3; i++)
{
if (newIndices.Contains(restIndices[(i * 3) + 0]) || newIndices.Contains(restIndices[(i * 3) + 1]) || newIndices.Contains(restIndices[(i * 3) + 2]))
{
for (int q = 0; q < 3; q++)
{
newIndices.Add(restIndices[(i * 3) + q]);
}
}
}
b.通过indexes对vertices的映射,将顶点加入新的数组c.把每个分出来的indexes的最小索引都变成0d.最后,将分出来的vertices和indexes赋给你new出来的mesh就可以了。注:如果,b和c不做也是可以将mesh分出来的,不过,每个小球的原点坐标还是会和原来一样。

缺点:

1.分离模型所需时间长(4000面的模型花了10s)2.对于非常小的物体,scale为1的情况下长度为0.00001之类untiy长度单位的模型,会有一定的误差(没办法,对于unity的mesh里提取出来的数据类型是float)

我的疑问

1.最后我是将分离出来的newvertices数组里的坐标重新再减去他们的平均值了,我觉得这样才是对。可是事实是,不用做这个步骤仍然可以分模型并将模型原点置为他们的mesh的中心。所以将新模型的模型置为中心的要点是把每个分出来的indexes的最小索引都变成0。这点我有点不清楚,希望有大牛能解答一下。2.有没有更快速一点的方法呢?速度仍然有些慢,有没有方法用GPU去做件事。用C++直接改fbx文件是我认为最快的,不过在unity里而不再max里做这件事的方法我就想到这一个。Git地址:https://github.com/PotroChen/SplitMeshByConnection
是个编辑器,将模型拖入场景,选中,在菜单栏中找到SparateMesh->splitMeshByConnection就可以了最后这个功能其实挺简单的,我也是看了很多国外的帖子才弄出来的,暂时找不到了,我网页收藏在公司的电脑里,改天贴出来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity3d