2012-07-11 89 views
0

我正在嘗試實現用於計算3D凸包的快速船體算法。 問題是我需要知道某個點是否可以「看見」給定的表面。確定一個點相對於給定3D表面的位置

表面有順時針或逆時針方向的方向。

我寫了一個小型的opengl程序來說明算法運算的圖形。

我想,我看到其他的算法使用(標準化叉積,從平面的點的距離)正在採取的算法

它們都導致了錯誤的一步各種方程。 這意味着他們決定某個表面是可見的(從圖中你可以看到它不是)

一個表面或「臉」的例子。

e1 = 0, 0, 0 to 10, 0, 0 
e2 = 10, 0, 0 to 10, 10, 0 
e3 = 10, 10, 0 to 0, 10, 0 
e4 = 0, 10, 0 to 0, 0, 0 

<---------/\ 
||  || 
||  || 
||  || 
\/---------> 

可以說我有兩點,我想知道他們位於表面的哪一側。

P1 = -1,-1,-1 P2 = 1,1,1

任何幫助,將不勝感激。

回答

1

第一步是確定飛機的法線。這可以通過交叉產品來實現。例如:

normal = cross(e2 - e1, e3 - e1); 

然後,你需要一個載體正常比較:

compare = point - e1 

而且兩個向量的點積形容,如果兩個向量在正常的指向同一個方向:

side = dot(normal, compare) 

如果側> 0,則點是在正常的朝向指向的平面的一側上。如果它是< 0,它在相反的一側。如果它是= 0,它恰好在飛機上。

的重要步驟是定義正常,以便它在正確的描述指出。只有多邊形,您可以按照角點的順序來定義法線。例如。上側是點是順時針的一側。如果你需要不同的東西,你必須提供更多的信息。

+0

只是爲了澄清,如果非要點標誌着邊緣然後交叉(E2 - E1,E3 - E1)=交叉(P3 - P2 - P2 + P1,P4 - P3 - P2 + P1)?我會測試它,並讓你知道它是如何工作的。 – Jonathan 2012-07-11 12:11:02

+0

我想我的問題是我正在使用所有點而不是連續3個點來計算面部正常。 – Jonathan 2012-07-17 13:20:30

相關問題