给定:使用一组顶点和三角形定义的3D网格构建具有这些点的网格。
问题:找到任意平面上投影的任意旋转网格的2d轮廓。
投影很容易。挑战在于找到平面中投影三角形边缘的“船体”。我需要一些关于研究这种算法的输入/指针的帮助。为简单起见,我们可以假设3D边缘直接向下投影到xy平面上。
我只看到凸解的答案,所以这里是非凸的。 (这意味着什么有点混乱。)
从2D三角形中取出所有边并将它们分组。如果两条边共享两个端点,则它们位于同一组中。所有只有一条边的组都是shell的一部分。
最后,您可以将外壳边缘组合到一个环上,将它们连接在一起。
此问题中提到的alpha形状技术处理顶点连接未知的一般点集:
Is there an efficient algorithm to generate a 2D concave hull?
但是,由于您已经知道可以通过投影保留的“面部”信息,因此可能不是最好的方法。
蛮力算法可能是可行的,尤其是在使用空间排序结构的情况下。例如,对于每个方面:
另一个想法,取决于你需要的保真度,只是从你的投影平面到原始几何体射出一束正常光线。创建一个2d命中/未命中并使用它来确定您的范围。
网格投影的2D轮廓是其边缘投影的子集。
使用此观察,可以使用以下方法确定2D轮廓:
请注意,此方法将报告与投影平面正交的所有边,即使是从投影平面的视点不可见的边。例如,对于圆环,它将找到内部轮廓和外部轮廓,即使圆环以这样的方式旋转,使得其内部孔从投影平面的视点不可见。要弄清楚哪些边可见,您需要进行某种可见性测试。如果预期用途是用户显示,则可以使用使用正交投影矩阵计算的深度缓冲来从投影平面的视点渲染几何图形,并进行一些z测试以确定哪些边缘在平面上可见。如果需要精度,则需要执行光线/三角形交叉以确定可见性。
只是补充一点:在投影中找到边缘的一种非常直观的方法是背面剔除!剔除和非剔除面之间的任何边缘应该是轮廓。如果要隐藏内部边缘,只需使用z缓冲区。背面剔除只是后投影顶点顺序,计算起来非常便宜。
是否只是将xyz点投影到任意平面上的x'Y'点然后在这些坐标中做一个凸包?