原创文章,转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/49638329
按照以下三维重建要点,你完全可以按步骤代码实现:
O. 初始化参数
一. 初始化一个三角面片:
1. 计算所有点的重心;
2. 找到离重心最近的一个点,设为ptn0;
3. 在ptn0的领域内,计算出最远的距离,找到距离它1/3len(但还是大于最小距离)的一个点作为ptn1;
4. 在领域中找到一个点ptn2,使得它们构成的外接圆的半径最小;
由这三个点构成一个三角面片,并且标记为边界点。
二. 构建Mesh:
1. 首先 从Mesh当中找到所有的边界半边;
2. 对于其中的每一条边界半边:如果端点还可以扩展,则进行如下操作,否则下一条:
1) 首先从这条边的上下两条邻边进行扩展,如果扩展成功则对新增加的那条边也进行三角重建;并且将重建构成的新的半边加入到半边集合当中。
2) 如果不能在上下两条边中进行扩展,则找出这两个端点的所有未使用的邻近点;
3) 对上面的每一个邻近点,构成三角形的第三个端点,但是要符合几个要求:
A. 新加入的两条边长度要小于阈值;
B. 三角形的内角都在一定的范围内: (20~100°)
C. 形成的二面角要大于阈值。
D. 形成的三角面片的外接圆半径最小。
E. 形成的新的面里面不能有边界点或者不能再扩展的点
4)找到符合重建的点以后,重建一个三角面片,同时重建新加入的两条边(只在前后两条边当中去重建),最后重建新加入的两条边放入到半边队列当中。
5) 如果某条半边的两个点都不能重建,则删除,直到半边队列当中没有边为止。
三.删除重建有重叠的三角片:
1. 首先找到边界点但非孤立点;
2. 对于每一个这样的点找到它的领域的边界面;如果边界面的个数小于2则没有重叠;如果有面与面之间的角度< 30° 则表示有重叠。
3. 如果出现重叠,将这些面删掉。
四、更新各个点的使用情况
遍历Mesh当中的每一个点, 对相应的点赋值上相应的标志位: 边界点: PT_BOUND 孤立的点:PT_NOT_USED 在面里面的点PT_IN_MESH 其余的点 PT_TRI_USED
五、对孔洞进行填补
1. 找到各个孔洞:
A。找到所有的边界边放在一个队列当中;
B. 从其中的一条半边开始,找到那条以这条边的起点为终点的半边,依次去找,直到找到以第一条的终点为起点的边为止;就找到一个孔洞,其余的类似;
C. 判断孔洞的有效性:1. 如果只有三条边,则可能是一个孤立的面
2.如果是4条边可能是两个孤立的面。。
3.如果边数载2--8 之间的时候,有共同的顶点也不行
遇到上述3种情况都需要把面删除掉。
2. 对孔洞进行填补:
1).* 如果边的数目小于20 删掉它周围的面,重新来,;如果是一般的孔洞则进行填补,否则不填补。
2). 进行以上操作以后,再进行两次 提取孔洞。进行填补的工作。
3. 再次更新点的使用信息,和上面一样
更多学习讨论可以加 3D图形算法工程群: 152235453
作者: iker Cross
时间: 2015.11.04