2016-12-15 11 views
0

ポイントが錐台の中にあるかどうかを判断する最良の方法を試しています。何か働いているが、あまりにも面倒であるかどうかは分からないし、もっとエレガントで効率的なやり方があるかもしれない。ポイントが錐台にあるかどうかを確認

私はポイントが「X」錐台の内側にあるかどうかを確認したいとします

Frustum example

私は錐台の8点の位置(4つの近くのポイント、4遠い点)を持っていたら、 、私は3つの点から作られた三角形に基づいて錐台の各平面の法線を計算しています。例えば、(上記の図のように)、右側のため、私は点の三から二つのベクトルを作成しています:

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

そして私は、これら2つのベクトル間の外積を行うこと巻順序を保証してい錐台の内部を指し示すように法線が正しい場合、この場合は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

ああ、OK!そのフォーラムについて知りませんでした。ありがとう! – kinkersnick

+0

この回答は多分お答えできます:http://stackoverflow.com/questions/6301085/how-to-check-if-an-object-lies-outside-the-clipping-volume-in-opengl –

答えて

2

あなたが取ったアプローチを完全に変更するのではなく、2つのプレーンのペアが平行であるという事実を利用することができます。そのプレーンのペアに対して1つの法線のみを作成します。すでに飛行機の「正面」にある点のテストがありますが、錐台の深さを知っていると仮定すると、同じ距離を使用して他の平行面に対して点をテストすることができます。

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

おっと!ごめんなさい!ちょうどupvotedしている! – kinkersnick

関連する問題