算法大致如下:
1)迭代所有三角形
2)迭代每个三角形的所有边
3)如果边缘与平面相交,则生成1或2个新三角形,丢弃旧三角形
4)如果没有边相交,则三角形保持完整或丢弃(取决于它所在的平面的哪一侧)
当然,这会在网格上留下一个洞,平面穿过它。什么是生成新网格填充洞的快速方法?对于凸几何,我可以使用平面上的一个新顶点作为起点,并将其连接到所有其他新点并生成三角形,但是对象不一定是凸的。
答案 0 :(得分:1)
如果在裁剪过程中三角形与平面相交,则其两条边必然相交,每条相交的边生成一个新顶点,因此为该三角形生成两个新顶点(忽略平面与该三角形完全相交的情况)三角形顶点)。对于每个新顶点,应该跟踪在与初始新顶点的边缘相邻的两个三角形中创建的另外两个新顶点。然后,通过简单地遍历这些相邻新顶点的所有不同链,可以重建(可能是非凸的)填充多边形以封闭被剪裁网格的孔。要从这些多边形中获取凸多边形或简单三角形,请应用凸分解或多边形三角剖分算法(请参阅Polygon triangulation)。这假定输入网格是不透水的,具有适当的三角形边(一条边仅由两个三角形共享)并忽略与顶点/平面交点相关的问题。
实际上:每当在一个三角形中创建新顶点时,跟踪在同一三角形中创建的另一个新顶点的索引(反之亦然)。因此,每个新的顶点ID最终被映射到两个新的顶点ID,一个创建到“左”,一个创建到新顶点的“右”。 “左”/“右”方向是从平面方向和两个相邻新顶点的相对方向导出的。裁剪完成后,在映射中选择一个新顶点,以相同方向(左或右)遍历映射以提取整个多边形链,并在此链关闭后(返回到第一个选定顶点),新建一个可以将填孔多边形添加到剪裁的网格中。继续在映射中选择未使用的新顶点并遍历映射,直到所有新顶点都用在填孔多边形中。