投影3D网格的2D轮廓算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了投影3D网格的2D轮廓算法相关的知识,希望对你有一定的参考价值。
给定:使用一组顶点和三角形定义的3D网格构建具有这些点的网格。
问题:找到任意平面上投影的任意旋转网格的2d轮廓。
投影很容易。挑战在于找到平面中投影三角形边缘的“船体”。我需要一些关于研究这种算法的输入/指针的帮助。为简单起见,我们可以假设3D边缘直接向下投影到xy平面上。
- 从最右边的点开始(具有最大x坐标的点)
- 从这一点获取所有优势
- 沿着与正x轴最小角度的边缘,并将其添加到解集
- 从达到的点开始,跟随并添加具有最小角度的边缘到您来自的边缘
- 重复,直到达到原始点
我只看到凸解的答案,所以这里是非凸的。 (这意味着什么有点混乱。)
从2D三角形中取出所有边并将它们分组。如果两条边共享两个端点,则它们位于同一组中。所有只有一条边的组都是shell的一部分。
最后,您可以将外壳边缘组合到一个环上,将它们连接在一起。
此问题中提到的alpha形状技术处理顶点连接未知的一般点集:
Is there an efficient algorithm to generate a 2D concave hull?
但是,由于您已经知道可以通过投影保留的“面部”信息,因此可能不是最好的方法。
蛮力算法可能是可行的,尤其是在使用空间排序结构的情况下。例如,对于每个方面:
- 项目方面在飞机上
- 检查投影面是否完全被现有几何体包围,如果是:完成(无需扩展投影轮廓)
- 如果点落在现有几何体之外,请执行三角形 - 三角形交叉点以确定哪些部分落在外面,构建任意n-gon(可能是凹面)以填充缺失的空间,然后将n-gon切入三角形
另一个想法,取决于你需要的保真度,只是从你的投影平面到原始几何体射出一束正常光线。创建一个2d命中/未命中并使用它来确定您的范围。
网格投影的2D轮廓是其边缘投影的子集。
使用此观察,可以使用以下方法确定2D轮廓:
- 仅属于一个面的每个边的投影是2D轮廓的一部分,
- 对于其他边缘,确定其相邻面的法向量
- 用投影平面的法线计算那些法线的点积
- 如果点积的所有符号不相同(这意味着,一个面指向投影平面,而至少另一个面不指向投影平面,则该边缘的投影属于2D轮廓,其将边缘识别为大纲)。
请注意,此方法将报告与投影平面正交的所有边,即使是从投影平面的视点不可见的边。例如,对于圆环,它将找到内部轮廓和外部轮廓,即使圆环以这样的方式旋转,使得其内部孔从投影平面的视点不可见。要弄清楚哪些边可见,您需要进行某种可见性测试。如果预期用途是用户显示,则可以使用使用正交投影矩阵计算的深度缓冲来从投影平面的视点渲染几何图形,并进行一些z测试以确定哪些边缘在平面上可见。如果需要精度,则需要执行光线/三角形交叉以确定可见性。
只是补充一点:在投影中找到边缘的一种非常直观的方法是背面剔除!剔除和非剔除面之间的任何边缘应该是轮廓。如果要隐藏内部边缘,只需使用z缓冲区。背面剔除只是后投影顶点顺序,计算起来非常便宜。
是否只是将xyz点投影到任意平面上的x'Y'点然后在这些坐标中做一个凸包?
以上是关于投影3D网格的2D轮廓算法的主要内容,如果未能解决你的问题,请参考以下文章