1

マップとして大きなメッシュを使用したthree.jsシーンがあります(blenderからエクスポートされました)。

私はそれをロードします:

// map
var loader = new THREE.JSONLoader(true);
var thiz = this;
loader.load(
    "iceworld.js"
    , function(geometry, materials) {
        materials[0].side = THREE.DoubleSide;
        var faceMaterial = new THREE.MeshLambertMaterial( materials[0] );
        //var faceMaterial = new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture( 'ice.jpg' ), side: THREE.DoubleSide } );

       mesh = new THREE.Mesh( geometry, faceMaterial );
       thiz.scene.add( mesh );
     }
);

私はを使用しPointerLockControlsます。これで、衝突検出がないため、マップの壁を通り抜けることができます。

どうすればこれを実装できますか?例とドキュメントで解決策が見つかりませんでした。

4

1 に答える 1

2

Three.jsはグラフィックレンダリングライブラリであり、衝突検出には関係しません。そのためには何か違うものが必要です。ここにいくつかのオプションがあります:

  • シーンの大部分が平面で長方形の場合、つまり3Dであっても、プレーヤーは壁が単純な形状の2D平面を1つだけ歩く場合は、障害物の位置を示す単純なグリッドを作成して、プレーヤーの座標をグリッドを作成し、壁の内側に移動した場合は移動をキャンセルします。
  • 物理エンジンを使用する:Physijsは、Three.js用の使いやすく柔軟なBulletDynamicsエンジンラッパーです。シーンメッシュを単一Physijs.ConcaveMeshの内部にラップし、カメラに衝突形状を追加して、即座に正確な衝突検出を行うことができますが、かなり複雑なシーンがある場合は遅くなります。
  • より良いアプローチは、シーンを長方形の壁セクションなどの個別のオブジェクトに分割し、それらに個別に安価な衝突形状(立方体、球、円柱など)を追加することです。Physijsがそれを行うことができ、次にcannon.jsがあります(ここでFPSデモを参照してください)。
  • 独自の衝突検出をロールします。これはうさぎの穴なので、あまりお勧めしませんが、どの機能、精度、パフォーマンスのトレードオフが最適かを完全に制御できます。

個人的には、Three.jsでFPSゲームを作成しました。私のレベルデザインは非常に規則的であるため、プレーヤーの衝突にグリッドメソッドを使用できますが、動的オブジェクト(バレル、ボックスなど)も必要であり、Physijsを使用すると、それらを簡単に統合できませんでした。したがって、壁の衝突は、壁セクションにPhysijsキューブを作成することによって処理されます。

于 2012-12-20T07:37:52.427 に答える