展平 3D 三角形带的算法

Algorithm to flatten a 3D triangle strip

我有一个 3D 三角形带(见插图)。三角形不在一个平面上。

我想展平三角形带,使所有三角形都位于第一个三角形的平面内。

计划是围绕与第一个三角形的连接边旋转第二个三角形,使其与第一个三角形在同一平面内。然后我对其他三角形继续这个方法,直到它们都在平面上。

  1. 我正在寻找一种快速算法来做到这一点。
  2. 还有其他方法可以把三角带压平吗?

最快的方法是 1) 计算第一个三角形定义的平面方程 2) 将所有休息点投影到这个平面上

请记住,您一次只能移动一个点。由于每个三角形与前一个三角形共享两个点,因此只有远点需要移动,并且将围绕其他两个点创建的轴移动,直到它位于所需的平面上。重复此过程直到完成。

如果您只旋转每个三角形,则必须旋转所有下一个三角形以保持几何形状不变 - 这种缓慢的方式具有二次复杂度。

除此之外,您还可以存储三角形顶点的相互位置并在平面中恢复它们。

可能的方式(我假设顶点编号是顺序的):

对于第 N 个点 C=P[N] 计算并存储 Len - 它投影到直线 AB 的长度 (A=P[N-2], B=P[N-1])

   Len = VectorLength(VectorProduct(UnitAB, AC))

以及该投影在那条线上的位置(作为参数 t)。

 t = DotProduct(AC, AB) / DotProduct(AB, AB)

要在飞机上建造C'=P'[N],计算

C' = A' + t * A'B'  + Len * VectorProduct(UnitPlaneNormal, UnitA'B')