【问题标题】:Tetrahedron orientation for triangle meshes三角形网格的四面体方向
【发布时间】:2012-05-16 05:58:53
【问题描述】:

我有 2 个三角形和顶点 p0、p1、p2、p3。这两个三角形共享一条边。从这两个三角形中,我想制作一个由 4 个顶点给出的四面体。我使用的库要求“应给出 4 个顶点,以便在从外部查看时,定义图形中四面体面的四个顶点三元组以逆时针顺序出现”。假设两个三角形之一是 p0、p1、p2,我将法线计算为 (p1-p0) (cross) (p2-p0)。有人可以告诉我一种方法来确保满足这个条件吗?

【问题讨论】:

  • 很遗憾,您费尽心思提供了一个非常清晰的图表,然后在问题文本中为顶点使用了错误的标签。我第一次读的时候很困惑。
  • 您通常需要一些其他方式来决定外部 - 通常这来自网格算法(行进立方体等)
  • 如果两个三角形的法线计算方式与描述中提到的相同,我不能只选择一侧(法线指向的一侧)并考虑它的前面还是后面?
  • 简短的回答:是的,只要您以一致的顺序获得积分...

标签: algorithm math geometry computational-geometry


【解决方案1】:

简答:

条件是p3必须在(p0, p1, p2)确定的平面的正确一侧。

因此,在计算了该平面的法线之后,您需要确定从(例如)p0p3 的向量是指向法线的相同方向还是相反方向,通过取点产品dot(normal, p3-p0).


从数学上讲:

您需要找到由四个点的齐次坐标形成的 4x4 矩阵的行列式。行列式的符号决定是否满足条件;适当的符号取决于使用的确切约定,但理想情况下应该是正数:

require:
  0 < det(p0, p1, p2, p3)

  == det [ p0.x p0.y p0.z 1 ]
         [ p1.x p1.y p1.z 1 ]
         [ p2.x p2.y p2.z 1 ]
         [ p3.x p3.y p3.z 1 ]

如果一组特定的有序点具有负行列式,您可以通过交换任意两个点来修复它(这将使行列式取反):

e.g., swapping p0 and p2:

det(p0, p1, p2, p3) = - det(p2, p1, p0, p3)
     ^       ^               ^       ^

或者,更一般地说,在四个顶点的even and odd permutations 之间切换。

如果行列式为零,则四个点共面,不能这样固定。


最后是代码:

使用 3-d 矢量数学计算此行列式的相对简单的方法:

let:  v1 = p1 - p0
      v2 = p2 - p0
      v3 = p3 - p0
      norm12 = cross(v1, v2)
   -> determinant = dot(norm12, v3)

最终行列式也称为 v1、v2 和 v3 的“三重乘积”。

请注意,我一直犹豫尝试从您的问题中解码确切的符号约定(即,您需要行列式是正数还是负数):您提供的措辞和图表有点令人困惑。

不过,由于您拥有原始库及其文档,因此您最适合回答这个问题。作为最后的手段,您可以尝试经验方法:尝试两个标志,然后选择一个不会爆炸的...

【讨论】:

  • 非常感谢您的澄清回答。它就像一个魅力
猜你喜欢
  • 2013-02-25
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
相关资源
最近更新 更多