2012-02-08 13 views
1

XNAにFPSを構築しており、衝突検出を実装中です。私たちの壁は長方形なので、BoundingBoxクラスは良い選択肢のように見えましたが、軸は整列しています。私たちは本当に非軸に整列した壁を持つことを望みます。私たちが見てきたディスカッションの大半は、BoundingSpheresを使用すると言いますが、壁は実際には回転した長方形であるため、これは最良の選択肢のようには見えません。バウンディングボックスを使用したXNA衝突検出

キャラクターの動きを光線でモデル化することができました。回転行列を使用して、これらの光線をワールドスペースから軸に合わせたボックススペースに変換できるはずです。残念ながら、私たちは目に見えない(または何らかの大きさの)壁に衝突しているように見えるので、この変換では何かが間違っていると思うし、フロア交差点(まだとにかく回転しない)でレイが生成されます。レイを使用する唯一の理由は、生成が容易でボックスのスペースに変換しやすく、実際の衝突検出にAxis Aligned BoundingBoxsのようなXNAクラスを使用できることです。

我々はこのようにそれを実装しました:

internal float? collide(Ray ray) { 
    Matrix transform = Matrix.Invert(Transform); 
    ray.Direction = Vector3.Transform(ray.Direction, transform); 
    ray.Position = Vector3.Transform(ray.Position, transform); 
    return new BoundingBox(new Vector3(-.5f, -.5f, -.5f), new Vector3(.5f, .5f, .5f)).Intersects(ray); 
} 
public Matrix Transform { get { return Matrix.CreateScale(size) * rotate * Matrix.CreateTranslation(pos); } } 

回しは、コンストラクタに渡され、Matrix.CreateRotationYへの呼び出し(シータ)が形成されています。衝突した光線は、世界の空間にあります。 Transformは、レンダリングのためにモデルに適用される行列です。このモデルは(-.5、-.5、-.5)から(.5、.5、.5)になる立方体です。

私たちの質問には、いくつかの点があります。光軸に対して非軸の位置合わせされたボックスの衝突検出を行うには、より良い方法がありますか?レイを使うよりももっと良い方法がありますか?明らかに私たちのコードに間違った何かをしているだけなのですか?可能であれば、XNAのクラス(またはすでに書かれているコード)に可能な限り依存し、ラッパークラス以上のものを書く必要はありません。

+0

私は実際に答えを出すことはできませんが、これらのポインタが役立つかもしれません。ここでは、私のレイトレーシングプロジェクトhttp://github.com/danieljfarrell/pvtraceのためにこれをどのようにしたのですか? (1)AABB交差コードを作成する、(2)変換マトリックスを用いてシーン内の任意の位置にAABBを移動する、(3)ボックスの座標フレーム内で交差を行う(すなわち、標準AABB交差コードを使用することができる)ボックスに逆変換し、レイに変換します。 (4)ボックス枠内で交点を取得する、(5)順変換を適用してワールドフレーム内の交点を得る。エレガントですが、高価ですか?教えてください。 –

答えて

0

あなたが長方形(2d)を回転させて衝突検出を維持しようとすると、私は答えがあります。私がXnaを学んだとき、私は長方形を使いました。テクスチャの四角形には小さな四角形がたくさんあり、衝突ごとに衝突を検出できます。

+0

明確にするために、私たちのゲームは3D FPSです。 – dazerdude