2016-12-15 85 views
0

我試圖找出確定點是否在平截頭體內的最佳方法。我有一些工作,但不知道它是否太麻煩,也許有一種更優雅/有效的方式,我應該這樣做。確定點是否在平截頭體

假設我想找出是否點「X」是平截裏面:

Frustum example

一旦我有截的8點的位置(4附近分,4個遠點) ,我正在根據三個點的三角形計算平截面的每個平面的法線。例如(如上面在圖中),用於右側,我從三個點的使兩個向量:

Vector U = FBR - NBR 
Vector V = FTR - NBR 

然後我提出這兩個矢量之間的叉積,確保纏繞順序對於正常指向裏面的錐體是正確的,在這種情況下,V x U會給出正確的正常值。

Right_normal = V x U 

一旦我有正常的各平面,我然後檢查點x是否是在該平面的前面或後面通過從x到飛機的點中的一個繪圖的載體:

Vector xNBR = x - NBR 

然後我做這個載體,正常和測試,答案是肯定的之間的點積,確認是否點x是截頭的那架飛機的正確的一面:

if (xNBR . Right_normal < 0) 
{ 
    return false; 
} 
else continue testing x against other planes... 

如果x對所有平面都是正的,那麼它在平截頭體內。

所以這似乎工作,但我只是想知道我是否以愚蠢的方式做到這一點。我甚至不知道到昨天爲止「交叉產品」是什麼意思,所以對我而言這些都是新鮮事,我可能會做一些相當愚蠢的事情。

+0

「我有一些工作」,那麼你想要做的是張貼在代碼審查論壇。 – UKMonkey

+0

啊,好的!不知道那個論壇。謝謝! – kinkersnick

+0

也許接受這個答案的答案:http://stackoverflow.com/questions/6301085/how-to-check-if-an-object-lies-outside-the-clipping-volume-in-opengl –

回答

2

爲了適應你採取的方法,而不是完全改變它,你可以利用這樣的事實,即2對平面是平行的。爲這對飛機創建一個法線。您已經對其中一個平面的「前面」點進行了測試,但假設您知道截錐體的深度,則可以使用相同的距離來測試該點與其他平行面的距離。

double distancePastFrontPlane = xNBR . Right_normal; 
if (distancePastFrontPlane < 0) 
{ 
    // point is in front of front plane 
    return false; 
    if(distancePastFrontPlane > depthFaceRtoFaceL) 
    { 
     // point is behind back plane 
     return false; 
    } 
} 

如果你有多個點來測試針對相同的圓臺,你可以受益,因爲你只計算視錐深度一次(每對平行平面)。

+0

好點, 謝謝! – kinkersnick

+0

...但顯然不夠好的upvote。 – ROX

+1

哎呀!抱歉!剛剛投票! – kinkersnick