[解決済み] three.jsで衝突を検出する方法は?
質問
three.jsを使っています。
私のシーンには2つのメッシュジオメトリがあります。
これらのジオメトリが交差している場合(または が交差する これを衝突として検出したい。
three.jsで衝突判定を行うにはどうしたらよいですか?もしthree.jsに衝突判定機能がない場合、three.jsと組み合わせて使える他のライブラリはありますか?
どのように解決するのですか?
Three.jsでは、ユーティリティのCollisionUtils.jsとCollisions.jsはもうサポートされていないようで、mrdoob(three.jsの作者)自身がthree.jsの最新版に更新して、代わりにこの目的のためにレイクラスを使用するよう推奨しています。以下は、そのための一つの方法です。
例えば、quot;Player"というメッシュが、quot;collidableMeshList"という配列に含まれるメッシュと交差しているかどうかをチェックしたいとしましょう。プレイヤーメッシュの座標 (Player.position) から始まり、プレイヤーメッシュのジオメトリの各頂点に向かって伸びる一連の光線を作成することができます。各レイには "intersectObjects" というメソッドがあり、レイが交差したオブジェクトの配列と、各オブジェクトまでの距離 (レイの原点から測定) が返されます。交差点までの距離がプレイヤーの位置とジオメトリの頂点間の距離より小さい場合、衝突はプレイヤーのメッシュの内部で発生したことになります。
に動作例を掲載しました。
http://stemkoski.github.io/Three.js/Collision-Detection.html
赤いワイヤーフレームキューブは矢印キーで移動、W/A/S/Dで回転させることができます。 青いキューブの1つと交差すると、上記のように交差するごとに1回、画面上部に"Hit"という文字が表示されます。 コードの重要な部分は以下の通りです。
for (var vertexIndex = 0; vertexIndex < Player.geometry.vertices.length; vertexIndex++)
{
var localVertex = Player.geometry.vertices[vertexIndex].clone();
var globalVertex = Player.matrix.multiplyVector3(localVertex);
var directionVector = globalVertex.subSelf( Player.position );
var ray = new THREE.Ray( Player.position, directionVector.clone().normalize() );
var collisionResults = ray.intersectObjects( collidableMeshList );
if ( collisionResults.length > 0 && collisionResults[0].distance < directionVector.length() )
{
// a collision occurred... do something...
}
}
この特殊な方法には、2つの潜在的な問題があります。
(1) 光線の原点がメッシュM内にある場合、光線とMの衝突結果が返されない。
(2)プレイヤーメッシュに対して小さなオブジェクトは、様々な光線の間をすり抜けてしまい、衝突が登録されない可能性があります。 この問題の可能性を減らすには、小さなオブジェクトが光線を作り、その視点から衝突検出を行うようにコードを書くか、メッシュに多くの頂点を含める(例えば、CubeGeometry(100, 100, 100, 20, 20)ではなく、CubeGeometry (100, 100, 1, 1, 1) を使用するなど)、二つのアプローチが考えられます。後者の方法は、おそらくパフォーマンスヒットを引き起こすので、控えめに使用することをお勧めします。
この質問に対して、他の方が解決策を寄稿してくださることを期待しています。 私自身、ここで説明した解決策を開発するまで、かなりの間、この問題に苦心しました。
関連
-
[解決済み] React with ES7: Uncaught TypeError: Cannot read property 'state' of undefined [duplicate] (未定義のプロパティ'state'を読み込むことはできません。
-
[解決済み】Kendo Observable Bindingと併用する場合、Kendo Switch Labelsを変更することは可能ですか?[Kendo-UI]です。
-
[解決済み] 要素外でのクリックを検出するにはどうすればよいですか?
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] jQueryで要素が非表示になっているかどうかを確認するには?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] event.preventDefault() vs. return false
-
[解決済み] jQueryを使用してキーボードのEnterキーを押したことを検出する方法は?
-
[解決済み] JavaScriptが無効になっているかどうかを確認する方法を教えてください。
-
[解決済み】別のウェブページにリダイレクトするにはどうすればいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】TypeError: 'undefined'はオブジェクトではありません。
-
[解決済み】XMLHttpRequestモジュールが定義されていない/見つからない
-
[解決済み】Javascriptのコールバック関数がFirefoxで「Callback is not a function」というエラーを投げる
-
[解決済み】JavaScript "Uncaught TypeError: object is not a function" 連想性の質問
-
[解決済み】WebpackとBabelで「このファイルタイプを扱うには適切なローダーが必要な場合があります。
-
[解決済み】XMLパースエラー:ルート要素が見つからない コンソールの場所 FF
-
[解決済み] ローカルファイルを開くことができません - Chrome: ローカルリソースのロードが許可されていません
-
[解決済み】TypeError:res.jsonは関数ではありません。
-
[解決済み】Javascript、[オブジェクトHTMLInputElement]を表示中。]
-
[解決済み】中央値の計算 - javascript