最早整这个是因为当时玩合金装备时,有个子弹时间的切割,可以任意切割所有模型.就好奇的也整了个.
最终效果
思路:
- 确定切线的平面
- 根据切面将模型的顶点分类切面的上/下 两部分。
- 对顶点间的连线进行顶点补充,并顺序连接顶点。
- 将切开的剖面顶点进行排序、补面、设置UV等。
讲解:
为了方便这里我们拿BOX举例。
当一个box被裁切时,我们根据裁切面,将模型的顶点分为两类,顶点0145为模型A,顶点3267为模型B,同时A组和B组按顺序记录每个顶点的信息。
然后我们按照之前的网格的顶点索引,依次判断连接当前两个模型的顶点。
结果如下:
这时候我们需要在被切的面上,补充顶点,并且连接.
回到一开始被切的时候,我们来分析被切的面.
如图,一个平面是两个三角面,一个三角面被切割时,我们需要补充2个顶点.这时候我们就需要判断三角面上2个顶点的位置,然后依次连接他们,形成面.
如图:当三角形abc被x轴切开时,
我们先求出ab和oa在y轴上的投影:
既 oay = Vector.Dot(a-o,y-o);
bay = Vector.Dot(a-b,y-o);
然后求出他们在y轴上的投影比:
scale = oay/bay;
然后d的位置就相当于以a为起点,在ab的方向移动了scale的比例.
d = a+(b-a)*scale;
e同理.
这样,我们根据网格的连接顺序,以此连接aed,bdc,cde,再把顶点以此加入到各自归属的模型中.就得到了如下的模型:
最后我们需要把这个空白的剖面填充,不需要添加顶点,但需要把当前的标记出来的顶点,进行合理的排序连接.幸运的是,我们之前生成的顶点都是两个重叠在一起的,因为每个三角面生成2个顶点而三角面是互相拼接的.而不重叠的顶点都是互相连接的,在排序的过程中,删除掉重复的顶点.
当获得正确的顶点顺序:只需要012,023,034,,,,这样依次连接他们就可以把剖面填充上.
最后我们需要给每个顶点合适的uv,来填充贴图.
映射uv就看个人的需求了,可以用box或者球形映射等,来
满足需求.
常规排序
那如何对凸多边形上内任意若干的顶点进行连接呢。
这时候我们需要根据凸多边形的外切线和角度来确定下个顶点的位置。
这里只提供思路,代码太长就不贴了,而且在模型切割上效率不如上面的高。
首先将顶点都转换到切线寻找凸多边形的外切线向量。
然后逐顶点对比角度。
如果两个顶点与切线共线,我们就比较距离,一个顶点只有2个顶点连接他。第一次共线距离为近的排序,第二次共线距离为远的排序。
凹多边形
有人问凹多边形如何填充,呵呵,如果填充凹多边形,要先把凹多边形分割成若干个凸多边形进行填充。
GitHub地址:
https://github.com/carefreeq/SplitMesh
知乎@CarefreeQ