2

私は基本的な 3D XNA ゲームに取り組んできました。これまでのところ、さまざまなキャラクター モデルをより大きなレベル/ワールド モデルにロードすることができました。ユーザー/プレイヤーがキャラクターの 1 つを世界中で動かせるようにする基本的なコントロールをいくつか入れました。また、BoundingSphere/BoundingBox を使用して、他のキャラクター モデルとの衝突検出を実装しました。

ただし、キャラクター モデル (現時点では) は Y 軸上の固定された場所に固定されているため、私の世界は実際には滑走するための平面にすぎません。

私が今やりたいことは、重力のような力を実装することです。これにより、キャラクターが地形の流れに合わせて上昇したり落下したりできるようになります。キャラクターの境界球と世界の実際のメッシュとの間の詳細な衝突をチェックする何らかの方法について、Google 検索に (無駄に) 数時間を費やしました。私が見つけた記事はすべて、球体とボックスの方法の使用方法、または外部物理エンジンの実装方法を説明しているようです (これらはすべて、私が達成したいことに対して非常に精巧に見えます)。

だから私の質問は2つあります -

  • まず、私はこれに最善の方法で取り組んでいますか? 私の世界に大きなモデルが 1 つありますか?
  • 次に、XNA ライブラリ自体、またはまったく新しい物理層を導入する必要のない他のライブラリを使用して、必要な衝突のタイプを確認する比較的簡単な方法はありますか。

注意。衝突を確認したいモデルは次のとおりです。 Microsoft.Xna.Framework.Graphics.Model

編集:

また、単一のレベルを作成しているのではなく、データベースからロードされたさまざまなレベルで動作するゲーム エンジンを作成していることにも言及する必要があります。このため、レベルの制約を個別に/手動で定義する必要はありません。理想的には、データベースから単一のメッシュをロードして、それとの衝突をそのまま検出できるようにするか、メッシュ データから制約/境界領域を自動的に計算したいと考えています。

4

4 に答える 4

0

3D衝突検出は、一見すると思われるよりも複雑なので、所定の方法の1つを使用します(つまり、BoundingSphereオブジェクトが役立ちます)。http://msdn.microsoft.com/en-us/library/bb203906(v=xnagamestudio.10).aspxを確認してください

具体的には、このコードブロックはアイデアを与えます:

static void CheckForCollisions( ref WorldObject c1, ref WorldObject c2 )
{
    for (int i = 0; i < c1.model.Meshes.Count; i++)
    {
        // Check whether the bounding boxes of the two cubes intersect.
        BoundingSphere c1BoundingSphere = c1.model.Meshes[i].BoundingSphere;
        c1BoundingSphere.Center += c1.position;

        for (int j = 0; j < c2.model.Meshes.Count; j++)
        {
            BoundingSphere c2BoundingSphere = c2.model.Meshes[j].BoundingSphere;
            c2BoundingSphere.Center += c2.position;

            if (c1BoundingSphere.Intersects( c2BoundingSphere ))
            {
                c2.ReverseVelocity();
                c1.Backup();
                c1.ReverseVelocity();
                return;
            }
        }
    }
}
于 2012-10-08T23:01:36.197 に答える
0

最初の答えは、詳細な衝突検出の最初のパス テストです。その最初のパスを改良して、AABB テストを使用できます。2 番目のパスでは、光線と三角形の交差テストが必要になります。これらのいくつかは、光線が三角形のエッジまたは頂点に当たったときに失敗するため、注意してください。選択したテスター コード/アルゴリズムがこれらを考慮していることを確認してください。衝突検出の速度を向上させるために、クワッドツリーまたはその他の空間分割スキームを使用したさらなる変更があります。

于 2013-02-11T22:59:14.720 に答える
-1

あなたはそれを偽造することができます。言い換えれば、更新呼び出しのたびに、プレーヤーの高さを地形の高さに設定するだけでよいと思います。物事を処理する最も専門的な方法ではないと思いますが、うまくいくかもしれません。

于 2014-07-28T19:06:58.550 に答える
-1

以下は、私がかつて 2D 衝突検出に適用した球/三角形の手法の詳細な説明です。

http://www.peroxide.dk/papers/collision/collision.pdf

確実に役立つとは言えませんが、地形メッシュと重力との衝突には役立つかもしれません。それを他の「キャラクター」との衝突と組み合わせるのは、やりたいことによっては難しいかもしれません。ただし、重力を実装する方法については具体的に説明しており、全体としては、3D での衝突検出とキャラクターの物理演算に対するより単純なアプローチの 1 つです。

地形メッシュ全体との衝突が「正しい」方法であるかどうかという問題については...それが単純なメッシュであり、リソースに制約がない場合は、確かに. ただし、衝突検出は計算コストが高く、メッシュ内のすべての三角形に適用することはすぐに不可能になる可能性があります。一般に、三角形をoctreekd treeなどの効率的に検索可能な構造に保存し、キャラクターの近くにある三角形を大まかに検索して、衝突をより正確にテストするよりもはるかに短い時間でテストすることをお勧めします。メッシュ内のすべての三角形をテストします。

于 2013-02-11T23:14:13.827 に答える