Mesh减面算法详解

本篇文章所讲述如何实现mesh减面工具。  

思想由作者创建。

目录

1、Unity Mesh对象里的数据构成

2、智能减面详解

Unity Mesh对象里的数据构成

  这里主要介绍相关的数据,如下图。

    Triangles数组存储的是所有三角形对应于vertices数组里的顶点,triangles从坐标0~n依次存储了每个三角形三个顶点在vertices下的位置,uv也是跟vertices对应的,知道这些后我们就可以对mesh任意操作了。

智能减面详解

减面前数据结构准备

    在减面之前首先要将每个顶点自己做管理,以便容易操作,下面是伪代码,主要是因为这些数据对减面息息相关。

    首先要把mesh的顶点数据单独输出出来,每个顶点的存储结构可以是这样:

struct Triangle

{

   Vertice [] vert;

}

struct Vertice

{

    //自身顶点

    Vector3 vert;

    //与自身连接的三角形

    List<Triangle> nearbyTri;

    //与自身相连的点

    List<Vector3> nearbyVerts;

    //是否为边顶点

    bool border;

}

1、找到连接自身的三角形

    将mesh里的顶点按照顺序从0~n遍历,比如第0个下标的顶点,在       Triangles中依次对每个三角形的索引进行查找,只要有一个三角形的索引是自己的下标那么他就是连接自身的三角形。

nearbyTri里三角形的顺序是围绕着该点旋转为顺序存储,要确定,后面要用到。

    如图,每个三角形都有一条边与其他三角形共边,如下找到1这个三角形,找到这个三角形与其他三角形共用的顶点除了中间的点外,那么会找到2这个三角形,那么2就是邻居三角形,然后2再找其他的以此类推。竟然三角形能确定那与自身相连的点顺序也是没有问题的。存储顺序顺时针,判断顺时针方法:三角形1黄边叉乘蓝边结果为正,三角形2黄边叉乘黑边结果负,负在左边,所以顺时针就可计算。

2、是否为边顶点

    每个三角形都有两条边与其他三角形共边那么不是边顶点。

   

只要有一个三角形只有一条边与其他三角形共边,那么这个顶点就是边顶点。

减面算法

    本次算法通过减点实现减面,不加点或偏移点的计算。

    在上述步骤走完后这里进行减面,如果不想对边操作上面也已经标记了边,直接跳过就行。

    步骤: 

       1、遍历顶点,对顶点计算是否删除

       2、顶点删除位置重建三角形

        3、迭代遍历

1、遍历顶点,对顶点计算是否删除

   遍历每一个顶点,处理完一个顶点遍历下一个顶点知道遍历完一遍。

    遍历找到第一个要处理的点如图所示。

    减点需要两个条件成立:

  1. 所有面交叉计算法线夹角的角度是否小于设定值
  2. 每个三角形连接该定点两条边的差的长度是否小于设定值

   

所有面交叉计算法线夹角角度是否小于设定值

       计算出每个三角形切线方向也就是垂直该面的正向,比如1这个三角形,顺时针任意找到天边叉乘(如黄叉蓝)得到一个向量。

    将得到的每个向量与其他向量点乘求出夹角,找到最大的夹角比如下图这个(面是可以任意组合,比如2和5,这里假设找到1和2是最大夹角),假设本轮迭代所设置的减面角度小于这个30,那么这个点不能减,否则该条件成立。

每个三角形连接该定点两条边的差的长度是否小于设定值

       假设两条边的插值在设定范围内,那么条件成立。否则如下图黄和蓝两条边差值有0.5米,而设定是0.4,那么不成立。因为插值太大影响的范围比较大,减面后出问题几率大。

2、顶点删除位置重建三角形

点被删除后与这个点相连的其他点连接起来会有下图两种情况发生,我们通用将第二种情况处理成多个凸边形处理。

顺时和逆时针遍历线段,只要发现如图1红色圈的这种凹拐点就记录为连接点,两边都确定了一个点就将这两个点连接分为两个部分,一个部分是凸边形,另一部分继续处理,如图2又找出了两点又分出一个凸边形,以此类推直到处理完毕。判断凸凹用叉乘。

    凸边形要构建诺干个三角形,如下图中间的点被删了,这时候要构造三角形,怎么构造最合适呢?

      

    那么我们就要遍历所有组合的三角形,如下图(1-2-6、2-9-8、3-10-6等)这些组合,计算每个三角形3条边比值最小的那个,那它基本是最接近等边三角形的。

       这里找到2-9-8最像等边三角形,那么就连接,对应将黑色边上的点所对应的与自身顶点连接三角形添加到它们的队列,2-9-8连接好后被分出了两个地方需要连接,这个直接递归,然后规则跟上面一样处理,直到处理完毕。

       这个顶点弄完就到下一个点啦,就这样遍历直到点减到设定的值。

3、迭代遍历

   当遍历了一遍顶点还没减到设定的值,那么就要就要不断迭代,每次迭代上述两种条件越加越大,直到点减到设定的值或者迭代次数结束。

参考文献

  1. https://blog.csdn.net/chqj_163/article/details/107522038
  2. https://dev.gameres.com/Program/Visual/3D/PolygonReduction.pdf

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IChessChess

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值