2010-12-06 10 views
0

私は3Dプラットフォームのビデオゲームのための衝突検出システムを書いています。すべての基本がうまくいきます。しかし、登場人物が急斜面のポリゴンに着くと、ポリゴンの斜面を滑り降りる必要があります。私はこれをほとんど行うことができますが、衝突したポリゴンの傾きに一致する下向きベクトルを計算する方法を見つけることはできません。私はこれを含む多くのフォーラムを検索しましたが、答えを見つけることができません。3Dポリゴンの下り勾配ベクトルを計算するにはどうすればよいですか?

各ポリゴンは、ワールド空間内の3つの頂点(x、y、z)で構成されています。

また、各ポリゴンのサーフェスの法線もあり、ドットと交差のプロダクトに精通しています。

面法線のドット積のアークスと60度のように地面からポリゴンの傾きの角度を与えるワールドアップベクトルを取ることで、単純な角度値を計算することもできます。角度が60度よりも急であれば、私はキャラクターが斜面を滑り降りるべきだと決めました。しかし、ポリゴンの勾配に一致する下向きのベクトルが必要なので、時間の経過とともにその位置を適用して滑り落ちることができます。

私は勾配ベクトルが表面法線に対して垂直であるべきだと考えますが、私が持っている情報をもとにそれを計算する方法はわかりません。任意の助け

おかげで...あなたは自分の三角形の中心を見つけ、最低の頂点にいるからベクトルを取得し、プレイヤーの速度のベクトルの独立をしたい場合は

答えて

0

。それはようになり縮退例のテストを省略:

Vertex center = Sum(vertex[0], vertex[1], vertex[2])/3; 
Vertex lowest = Min(vertex[0], vertex[1], vertex[2]); // min of your up/down coordinate 
Vector slopeVector = Normalize(lowest - center); 

編集:希望「低」のポイントは、頂点の方向にない場合これは、正三角形やもののためにうまく機能しない 。より一般的な解決策は、三角形の中心によって定義される軸の周りで法線を90度回転させ、三角形の頂点の間の中間点の最高点と最下点の間の点を回転させることがあります。

これを独立に計算するのではなく、補間された頂点法線を計算するのとまったく同じように、多くの三角形全体で補間された全体の傾き勾配を計算するのが理想です。

0

私は現在のところ数学を持っていませんが、2次元方向/大きさを残して、通常の平面を押して(上方向ベクトルを取り除いて)2D方向を見つけたらどうなりますか? 1 - UpVectorを正規化されたノーマル(1 - フラットな地形ノーマル= 0、1 - シアー垂直崖= 1)で単純に傾斜を得ることができます。

2Dコンポーネントを適用するのに十分な傾きがあるかどうかは、Yコンポーネントを使用して判断できます。

完全に正確かどうかわかりませんが、少なくともあなたには近似はありません。

3

また、 'ダウン'ベクトルを指定する必要があります。

あなたが求めているのは、三角形の法線によって定義された平面に、その下向きベクトルの正規化投影です。

nonUnitAnswer = down - dot(down, triangleNormal) * triangleNormal; // could be 0 
answer = normalize_safe(nonUnitAnswer); 

(あなたはドットが正であることが、あなたのスライドシナリオのために、あなたはおそらく違った扱いにしたい下向きにポリを、持っていることを意味していることに注意しましょう)

(さらに、ドットの大きさあなたがスライドしたいと思う程度に対応しているかもしれません。また、スライドさせたい場合にはいくつかのカットオフがあります)

+0

+1私は過去にこのようにしました。ダウンベクトルの大きさを重力と同じに設定すると、正規化されていないnonUnitAnswerベクトルはダウンスロープ方向に作用する重力の成分になります。これは有用な値です。 –

関連する問題