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