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