2011-07-13 10 views
3

私はGJKアルゴリズムを再構築していますが、四面体の三角形の顔のテストに問題があります。しかし、ポイントとエッジのテストは完全です。GJKアルゴリズムの三角形の顔のテスト

四面体の外側にあり、特定の三角形の面に最も近いかどうかをテストします。

これまでのところ私の方法は、三角形の面の法線を計算し、その原点がその面の外にあり、その面に最も近いかどうかを判定するための一連の内積テストを行いました。私の方法には1つの大きな問題があります。私の法線が外側に向いていることを保証することはできません。私はより良い説明のために作られたこの図を参照してください:あなたは同じ三角形を見ることができるように頂点の順序に応じて、

は外側に直面している法線を生成するために別の外積「発注」を必要とします。彼らが外向きに向くようにする方法はありますか?そうでない場合は、これらの面をテストするためのより良い方法がありますか?ここに私のプロセスの例を示します。

if (dot(ABC, AO) > 0) { 
     if (dot(ACD, AO) <= 0) { 
      if (dot(ADB, AO) <= 0) { 
       if (dot(DCB, DO) <= 0) { 
        // closest to face of ABC 

       } 
      } 
     } 
    } 
} 

参考:

ABC、ACD、ADB、DCB =三角形の面の法線(あなたは私が絵から「左」の三角形を仮定している見ることができるように原点

DO =ベクトルから原点から)

AO =ベクトル

答えて

3

顔のABCで作業しましょう。 N = cross(B-A, C-A)を使用して標準を作成します。 dot(N, D-A) > 0の場合は、Nが内側に向いているため、逆にする必要があります。最後に、必要に応じてNを正規化してユニットノーマルを得る。

+0

私の顔のテストコードが間違っていると思います...あなたの頭の上から、その領域に含まれているかどうかを判断するには、三角形の外面を通常通り側面から突出したプリズム形状を作り出す。 2つの隣接する面がほぼ平行であれば、上記のコードはうまくいきません。 – kbirk

+0

私はあなたがここで何を求めているのかよく分かりません。私は、問題が起源が四面体に含まれているかどうかを判断していると思った。 (ちなみに、最も簡単なテストは、頂点に関する原点の[重心座標](http://en.wikipedia.org/wiki/Barycentric_coordinate_system_(数学))を使用することです。 –

+0

私は、起源が含まれているかどうかを判断しようとしていますが、それが外に出ている顔を知りたくないのであれば。 – kbirk