2009-10-04 12 views
14

this screenshotからわかるように、私は作業しているプラ​​ットフォーマーの物理エンジンを作ろうとしていますが、私は明確な問題に遭遇しました:私はあなたがこのメッシュを構成する三角形のどれかの角度を見つけることができる必要があります。その三角形。頂点の座標が与えられている三角形の三角形の法線の角度を求める

screenshot

私はプレイヤーがと接触している任意の三角形のすべての3点の位置を見つけるために、作成したアルゴリズムを使用することができますが、私は動作するようにそれらのポイントを使用する方法がわかりません三角形の回転。

回転とは、顔の中心から離れた法線の方向、つまり、その表面に立っていると人間が傾いている角度を意味します。誰かがこの問題を解決するための一連の方程式を考え出すことができますか?

+1

私はただのゲストです:-( –

+0

ありがとう皆さん、質問に答えました! –

答えて

34

あなたは外積を取る場合

p1 - p0 

p2 - p0 

p0p1と:2つのベクトルのは三角形の3つの頂点で、通常の値になります。三角形は、頂点が外向きの法線に対して時計回りに並んでいる場合、あなたを指しているとみなされます。これは左手のルールと呼ばれます。あなたの指がp0からp1にカールして左手を保持想像し、親指が通常の顔の向きに突き出:

face pointing away from camera face pointing towards camera

2

三角形には2つの法線があり(もちろん)、標準アルゴリズムから得られる法線は頂点の順番によって異なります。 wiki

"ポリゴン(三角形など)の場合、サーフェス法線は、ポリゴンの2つの(非平行な)エッジのベクトル積として計算できます。

しかし、通常の方向は、選択されたポイントの順序に依存して、あなたはそれを計算し、逆ベクトルはあなたが興味のある正常であるか否かを他のいくつかのヒューリスティックを使用して決定することができます。

9

外積が正しい答えです。その結果を正規化するのを忘れてはいけません。三角形の面積がゼロの場合、正常に定義された法線がないため、結果は無効です。あなたの3つの頂点をP0、P1とP2であれば基本的には、:

vector temp = cross(p1 - p0, p2 - p0); 
if (length(temp) < epsilon) then 
    Degenerate_triangle_error; 
else 
    return normalize(temp); 

また、他の答えが言うように、あなたが「上向き」または取得するかどうか、あなたの頂点の順序に依存し、通常の「下向きに」 。

+2

+1縮退三角形の良い点 –

+0

三角形に面積がゼロの場合は、どちらの線も定義していません三角形ではないポイントがありますか?それはガード節で捕まえることができますか? – jcolebrand

3

あなたの質問への回答を終了するには、三角形の単位法線ベクトルを取得したら、ドットプロダクトを使用して角度を計算することができます。

2つの単位ベクトルの内積は、それらの間の角度の余弦に等しいので、単位法線ベクトルと単位Upベクトルの内積のアークスを計算すると、三角形(水平から離れた角度)。

また、OpenGLは通常は右手座標系を使用しているので、使用している場合、三角形の頂点は反時計回りの順序になります。

関連する問題