3

シーンに2つの単純な3Dオブジェクト(球と立方体)があり、それらが衝突しているかどうかを検出したいと思います。

これはどのように達成できますか?

4

2 に答える 2

6

最も簡単なオプションは、Vector3のdistanceTo()またはdistanceToSquared関数を使用して、2つのオブジェクト間のユークリッド距離を使用することです。

例えば

console.log(yourCube.position.distanceToSquared(yourSphere.position));

2つのオブジェクト間の距離が、球の半径と立方体の側面の合計よりも大きい場合、それは潜在的な衝突になります。また、distanceToSquaredの方が高速であり(sqrtを呼び出さないため)、衝突をチェックするのに役立つため、distanceToSquaredも提案しています。

この方法は非常に正確ではないことに注意してください-基本的に2つの球の間の衝突をチェックします(立方体を立方体の側面の半分に等しい半径の球として推定します)が、それはセットアップに十分に近い/十分であることを望んでいます私の意見では、実装するのが最も簡単で最速です。

立方体の角が、特定の距離まで衝突をトリガーせずに衝突することに気付くかもしれません。別の立方体の辺の比率を渡すことで、「しきい値」を調整できます。立方体の周りの球体と、その球体の比率がセットアップに対して適切な推定衝突を取得するためにどのくらいの大きさであるかを想像してください。

頭に浮かぶもう1つの方法は、立方体に最も近い球上の点を見つけることです。

  • 2つの位置ベクトルを引くことで、球の中心から立方体の中心までの点を取得できることがわかります。
  • 上記の差ベクトルを正規化し、球の半径でスケーリングすることにより、球の立方体方向の点を取得できます。
  • 次に、その点が立方体の内側にあるかどうかを確認できます(座標が立方体の軸に位置合わせされたバウンディングボックス(AABB)内にあるかどうかを確認することにより)

例えば

var pointOnSphere = yourSphere.position.clone().sub(yourCube.position).normalize(). multiplyScalar(yourSphereRadius);

これが頭のてっぺんから外れている場合、上記のスニペットが機能することを保証できません。最初にチェックするために、pointOnSphereの座標にパーティクルを配置する価値があるかもしれません。

この本で確認できる3Dのより高度な衝突検出アルゴリズムは他にもありますが、可能な限りシンプル/高速に保つのが最善です。

于 2012-07-10T18:55:10.637 に答える
2

残念ながら、three.jsには衝突検出器がありません:衝突検出?

プラグインライブラリを使用する必要があると思います。このように:http://yomotsu.github.com/threejs-examples/cannonjs_box/

于 2012-07-11T13:04:08.463 に答える