Mesh Slicer 切割人体的原理分析

介绍:

下载地址:https://assetstore.unity.com/packages/tools/modeling/mesh-slicer-59618

Mesh Slicer 是一个可以进行切割人体或者切割其他物体的能力的,他比较好的一点是组织三角面的能力,不会像其他切割网格的方式会产生把多个原本独立的网格连接起来(因为这样索引设置简单)。

而介绍的Mesh Slicer 则比较好的解决这个问题,他原理是丢弃一些顶点信息然后重建了三角形网格。

以下介绍一下他的工作流程:

首先他需要指定一个plane来形成一个分割面。然后还需要一个slicdid,这个的作用是区别其他slicd动作,因为有可能你同时再割很多物体。然后把准备的数据和collider丢到CharacterComponentManagerFast中。

他会分成neg和pos来展示最终的切割,无论你有多少个分离的mesh,他都只会有这两个gameobject。每个gameobject下会有一个joint的connected的根节点。根节点的定义后面会说。

然后组织好网格数据信息,材质信息,collider信息等就开始建立一个线程分割或者你想单线程分割也行,但是割多物体会等待。

因为我们是人体分割,所以用的是mesh的分割SliceMesh。

我们切割后要把边缘上的网格给合并起来,他的做法是:

一:三角形重建:

先找到每个顶点的世界坐标是在我的切割平面plane的正面还是背面来做切割的。如果有一个在正面并且有一个在背面说明这里是切割的点,需要重新组织网格

然后分6种情况考虑分割,分别是:

一:顶点1在背面,其他都在正面

二:顶点2在背面,其他都在正面

三:顶点3在背面,其他都在正面

四:顶点1、2在背面,顶点3在正面

五:顶点3、2在背面,顶点1在正面

六:顶点1、3在背面,顶点2在正面

这三种情况就需要把顶点重新组织索引兵建立新的三角形。

建立的方式有两种,第一种是一个顶点被分割在面以外的,则要建立两个新的顶点个这个孤立的顶点组成一个三角形。

第二种是两个顶点被分割成另一面的则要建立两个顶点并且要建立成两个新的三角面。

而寻找的新的顶点的计算方式是每两个顶点之间确定一个方向,然后用一个射线去检测找到plane的位置,最终射线得到了一个距离,然后除以两点间的距离,得到了一个比例。

这个比例就是两个顶点间建立新点的位置,其他法线,uv之类的也是靠这个比例重新计算。

然后将所有属于plane正面的顶点放在一个数组,背面的放在另一个数组,用于后面的网格组织。

因为有可能重建之后有可能有相同位置的点,

还有可能是v1,v2,v3都在同一个方向上的,如果是的话就去掉中间点,而连接v1和v3.这样减少了网格和顶点。

所有的三角形都按照上面的逻辑执行。

二:组成新的网格:

组成三角面是用BzPoly来组织的之前,对每个边缘点都会先从蒙皮权重中拿到当前的顶点的位置信息,因为他最后会有布娃娃系统,顶点还是加上蒙皮信息才行,并且旋转到plane的法线方向。

从法线方向的意义也在于他MakeMesh的时候降为2维了来看三个顶点的normal之外的方向是否有一致的方向,如果有也是可以减少一个三角面的。

其他就相对比较简单了,组织法线啊,uv啊,骨骼蒙皮权重啊之类的。最终成为新的网格。

三:组织布娃娃

在CharacterComponentManagerFast中OnCompletePerSide是组织布娃娃系统并且骨骼相关信息的父节点放置的处理。

这里有个关键的潜规则,因为布娃娃系统是需要connecter body的。他需要这个对象来跟他形成依赖。而始终需要一个根依赖来让他下面的布娃娃都能随根节点的运动而运动,而不会出现没有根节点网格被拉伸的情况。

要让一个节点成为根节点是有要求的,在这里需要他有collider。如果自己或者子节点有collider他就有可能成为根节点。

然后如果同样有collider,谁的rigidbody的数量多则谁又会成为根节点。

根节点确定了后就是所有的节点的父节点设置了。

然后因为我们joint需要相互依赖,再这里他还对每个rigidbody的中心质量之类的进行了设置。

最后是重建网格输出结果

猜你喜欢

转载自blog.csdn.net/llsansun/article/details/114984084#comments_18658765