このチュートリアルに必要な Cube クラスのサンプル「CollisionCube.cs」は Per-Bone Collision Detection のページからダウンロードして下さい。

基本的にボーン単位で衝突判定を行う場合、ボーンのある種類のバウンディング構造体を取得します。これには多くの方法があり、バウンディングボックス、バウンディングスフィア、バウンディング直角プリズムなどが取得できます。

このチュートリアルではバウンディングボックスの使用方法を紹介します。

○このチュートリアルは走っているドワーフのチュートリアルを使って作成します。ですので、少なくともドワーフを歩き回らせるところまで「ドワーフが歩いたり走ったりするアニメーション」 チュートリアルを完了しておく必要があります。
○私はこのチュートリアルのために Cube クラスを作成しました。作成方法を示すことは、それが価値があるか無いかと言うよりも多くのトラブルになります。Cube クラスはワールド行列に基づいて視覚的に色のついた立方体を描画し、そして軸上に整列した立方体のバウンディングボリュームを取得できます。
○「CollisionCube.cs」を Per-Bone Collision Detection のページからダウンロードして下さい。 そして「Game1.cs」にソースコードをペーストするか、新しいクラスを作成し、そこにソースコードをペーストするかしてクラスを追加して下さい。
○最初にもう一人のドワーフを作成します。
  1. // Add this as a member variable
  2. ModelAnimator otherDwarf;
  3.  
  1. // Add this to LoadGraphicsContent
  2. otherDwarf = new ModelAnimator(this, model);
  3. otherDwarf.World = Matrix.CreateTranslation(5, 0, 5);
  4.  
○プレイヤーのドワーフの頭と新しいドワーフの左ひじの衝突判定を行うバウンディングボックスを表すため、新しく立方体オブジェクトを作成します。
  1. // Add these as member variables
  2. Cube leftElbow, head;
  3.  
○次のソースコードで、立方体の辺の長さが、頭が 1.2f、そしてひじが .6f となっていることに気づいて下さい。本当にボーンのバウンディングボックスのベストな寸法を測るには試行錯誤が必要です。バンディングボックスがボーンの中心座標と一致しないので、オフセットがほしくなることがよくあります。次のソースコードを加えて下さい。
  1. // Add this in load graphics content
  2. head = new Cube(graphics.GraphicsDevice, Color.Red, 1.2f);
  3. leftElbow = new Cube(graphics.GraphicsDevice, Color.Green, .6f);
  4. head.Projection = projection;
  5. leftElbow.Projection = projection;
  6.  
○立方体を描画したいと思いますが、それには立方体のそれぞれのボーンの座標変換に等しいワールド変換を設定しなければなりません。その方法の一つは、ModelAnimator.GetCurrentTransform メソッドを呼び出し、現在のフレームの絶対座標変換を取得します。
  1. // Add this to the Draw method
  2. head.View = view;
  3. head.World =
  4. dwarfAnimator.GetAbsoluteTransform(
  5. dwarfAnimator.BonePoses["head"].Index) * dwarfAnimator.World;
  6. head.Draw();
  7.  
  8. leftElbow.View = view;
  9. leftElbow.World =
  10. otherDwarf.GetAbsoluteTransform(
  11. otherDwarf.BonePoses["lelbo"].Index) * otherDwarf.World;
  12. leftElbow.Draw();
  13.  
○最後にプレイヤーの頭がもう一人のドワーフのひじに当たるように動かします。ひじと衝突していないときは緑色、衝突しているときは青色に変化します。
○私はこの機能を Cube クラスに追加しました。
  1. // Add this to the Draw method
  2. if (head.GetBoundingBox().Intersects(leftElbow.GetBoundingBox()))
  3. {
  4. leftElbow.Color = Color.Blue;
  5. }
  6. else
  7. {
  8. leftElbow.Color = Color.Green;
  9. }
  10.  

最終更新:2009年06月21日 12:54