已知:用一组顶点和三角形构建的3D网格。
问题:找出在任意平面上投影的任意旋转网格的2D轮廓。
投影很容易。挑战在于在平面上找到投影的三角形边缘的“外壳”。我需要一些关于研究此算法的输入/指针的帮助。为简单起见,我们可以假设3D边缘被垂直投影到xy平面上。
已知:用一组顶点和三角形构建的3D网格。
问题:找出在任意平面上投影的任意旋转网格的2D轮廓。
投影很容易。挑战在于在平面上找到投影的三角形边缘的“外壳”。我需要一些关于研究此算法的输入/指针的帮助。为简单起见,我们可以假设3D边缘被垂直投影到xy平面上。
补充一下:在投影中找到边缘的一种直观方式是背面剔除!任何一个被剔除和未被剔除的面之间的边缘都应该是轮廓线。如果您想隐藏内部边缘,只需使用z-buffer。背面剔除仅涉及后期投影的顶点顺序,并且计算成本非常低廉。
网格投影的二维轮廓是其边缘投影的子集。
基于这个观察,可以使用以下方法确定二维轮廓:
请注意,此方法将报告垂直于投影平面的所有边缘,甚至包括那些从投影平面的视角看不到的边缘。例如,在使用环面时,它将找到内部和外部轮廓,即使环面以使其内部孔不可见的方式旋转。要解决哪些边缘是可见的问题,您需要进行一些可见性测试。如果用于用户显示,则可以使用正交投影矩阵计算的深度缓冲区来渲染投影平面的几何形状,并进行一些z测试以确定哪些边缘从该平面可见。如果需要精度,则需要执行射线/三角形相交以确定可见性。
我只看到了凸解的答案,所以这里提供一个非凸解的答案。(不太清楚意图是什么。)
将2D三角形中的所有边分组。如果两条边共享两个端点,则它们属于同一组。所有只有一条边的组都是外壳的一部分。
最后,您可以通过将这些外壳边缘连接在一起来将其组合成一个环。
查看找到兔子轮廓的演示 这是上述算法的实现。