展平 3D 三角形带的算法
Algorithm to flatten a 3D triangle strip
我有一个 3D 三角形带(见插图)。三角形不在一个平面上。
我想展平三角形带,使所有三角形都位于第一个三角形的平面内。
计划是围绕与第一个三角形的连接边旋转第二个三角形,使其与第一个三角形在同一平面内。然后我对其他三角形继续这个方法,直到它们都在平面上。
- 我正在寻找一种快速算法来做到这一点。
- 还有其他方法可以把三角带压平吗?
最快的方法是
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')
我有一个 3D 三角形带(见插图)。三角形不在一个平面上。
我想展平三角形带,使所有三角形都位于第一个三角形的平面内。
计划是围绕与第一个三角形的连接边旋转第二个三角形,使其与第一个三角形在同一平面内。然后我对其他三角形继续这个方法,直到它们都在平面上。
- 我正在寻找一种快速算法来做到这一点。
- 还有其他方法可以把三角带压平吗?
最快的方法是 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')