スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

当たり判定(コリジョンマップ)を実装

XNAで当たり判定をやってみた。
方法としてはCollisionMapPipelineを作ってやって読み込み時に頂点情報をtagを介して渡しちゃう。
事前計算できるものはここでしておくとよさそう。


XNAには標準で簡単な当たり判定が付いているけど恐らくこれだけですべてカバーするのは無理そう。
よって色々やってみた。
以下はそのときのメモ。

とりあえず球と球の判定はめちゃ軽い
距離だけだかんね。

まずは線分と平面
「法線」と「平面状の点から点までのベクトル」の内積で点が平面の裏と表どちらにあるかがわかる
ということは線分の両端の2点とも内積を出して掛けた値が負であれば線分は平面と交差していることがわかる

板ポリゴン(三角ポリゴン)と線分
三角形a, b, cの法線Nを外積を使って求める
上記の線分と平面の条件にあてはまらなければ、衝突していない

三角形a, b, cを含む平面と直線との交点を求める
ポリゴンの1点をP0として 線分はP1-P2
交点 = P1+a*(P2-P1)
a = d1 / (d1+d2)//内分比を使って3つの点の距離の比を2点と平面までの距離に置き換える
d1とd2は線分の両端から平面に引いた垂線の長さである
よって平面と点の長さを求める必要がでてくる
距離 = |V||cos(θ)| //三角関数
距離 * |N| = |V||N||cos(θ)| //両辺に|N|を追加(内積の公式に形を変えてやる)
距離 = |Dot(N,V)|/|N|  //法線がノーマライズされているなら |Dot(N,V)|
以上のことからd1とd2が求められる
d1 = |Dot(N,P1-P0)|/|N|
d2 = |Dot(N,P2-P0)|/|N|


最後に交点pが三角形a, b, c内にあるかを判定する
この判定はベクトル
abとbp
bcとcp
caとap
のそれぞれの外積の向きがすべて同じかどうかで判断できる

ここで注意なのが辺の延長線上にpが来ると外積の結果が意図しない方向になることを踏まえる事
内積を使った場合安易に正か?とか負か?で判断すると嵌ることになる。
理由は上記の状態+浮動少数により0.000016f=正とみなしちゃうから!
正直一回ここに嵌った。

なんせ計算量が結構多いのが気になる。


別の方法を調べてみると
まず、aが原点(0,0,0)になるように、全部の点を平行移動した三角形abcと点pについて考える
a = (0,0,0)
b=b-a
c=c-a
p=p-a
このとき、
p-a = s(b-a)+t(c-a)
と表し
sとtが0から1であれば、pは△ABCの内部(辺の上も含む)
と考える

さて、この情報を元に式を展開したソースがこれ

//最後に交点pが三角形abc内にあるかを判定する
float s = (p.X * b.Y - p.Y * b.X) / (c.X * b.Y - b.X * c.Y);
if (s < 0 || 1 < s)
return false;
float t = (p.Y + c.X - p.X * c.Y) / (c.X * b.Y - b.X * c.Y);
if (t < 0 || 1 < t)
return false;

Console.WriteLine((Math.Abs(p.Z - (s * b.Z + t * c.Z))).ToString());
if (Math.Abs(p.Z - (s * b.Z + t * c.Z)) > 0.0001f)//浮動少数誤差をカバー
return false;


んで実験。
はい、なんかおかしい。誤差がでてる感じ。
どこかで計算ミスってるのかなぁ・・・

また明日にでも考えてみよう!
記事書いてる最中に思いついたのが以下

//最後に交点pが三角形abc内にあるかを判定する
float S = Vector3.Cross(b - a, c - a).Length();

float S1 = Vector3.Cross(a - p, b - p).Length();
float S2 = Vector3.Cross(b - p, c - p).Length();
float S3 = Vector3.Cross(c - p, a - p).Length();
if (Math.Abs(S - (S1 + S2 + S3)) > 0.01f)
return false;


やってみるとそこそこの精度だけどコリジョンマップ用のメッシュを細かくするとやっぱ誤差っぽい挙動。

いまいちバシって感じがないので、作り直す予定。

ねよっと。

コメントの投稿

非公開コメント

プロフィール

あしゅ

Author:あしゅ
ぷぃぷぃ日常。
いつのまにか雑記ブログに。

カテゴリ
最新記事
検索フォーム
最新コメント
リンク
このブログをリンクに追加する
ブロとも申請フォーム

この人とブロともになる

カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。