2012-05-16 43 views
7

我有2个三角形和顶点p0,p1,p2,p3。这两个三角形共享一个优势。从这两个三角形我想做一个由4个顶点给出的四面体。与我一起工作的图书馆要求“给出4个顶点,使得当从外部观看时,在图中定义四面体面的四个顶点三元组按照逆时针顺序出现”drawing。假设两个三角形中的一个是p0,p1,p2,则计算法线为(p1-p0)(十字)(p2-p0)。有人可以告诉我一种方法来确保满足这个条件吗?三角形网格的四面体方向

+2

这是一个耻辱,你去所有的麻烦提供一个非常清晰的图,然后用问题文本中顶点的错误标签。我第一次读它时非常困惑。 –

+1

您通常需要一些其他方式来决定外部 - 通常这是来自网格算法(行军立方体等) –

+0

如果两个三角形都有以与描述中提到的相同方式计算的法线不能只选择一边(正常指向的那个)并将其视为前方还是后方? – Ray

回答

10

简短的回答:

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

所以,计算正常的该平面之后,就需要确定是否从(比方说)p0p3载体在正常的相同的方向,或沿相反的方向指向,通过取点积dot(normal, p3-p0)


更多从数学上讲:

你需要找到的四个点的齐次坐标形成的4×4矩阵的行列式。行列式的符号决定条件是否被满足;相应的符号取决于所使用的确切约定,但理想的应该是积极的:

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) 
    ^ ^   ^ ^

,或者更一般地,4个顶点的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。

请注意,我一直在犹豫,试图从您的问题中解码确切的符号约定(即,您是否需要决定因素是正数还是负数):您提供的措辞和图表不仅是有点混淆。

由于您拥有原始图书馆及其文档,因此您处于回答此问题的最佳位置。作为最后的手段,你可以尝试一下经验方法:尝试两种迹象,并选择一个不炸毁的...

+0

非常感谢你的澄清答案。它像一个魅力 – Ray