2017-03-12 4 views
0

私はブラウン運動のシミュレーションを行うためにthree.jsを使用しています。私は小さな分子を互いに衝突させる必要がある部分に固執しています。私は、コードを実行すると3Dの衝突を検出できませんJavaScript

function intersects(sphere, other){ //check if the distance between one sphere and the other is less than radius of both (4) 
    var distance = Math.sqrt((sphere.position.x - other.position.x) * (sphere.position.x - other.position.x) + 
          (sphere.position.y - other.position.y) * (sphere.position.y - other.position.y) + 
          (sphere.position.z - other.position.z) * (sphere.position.z - other.position.z)); 
    if(distance < (4)){ 
     return true; 
    } else { 
     return false; 
    } 
} 

function checkCollision(current){ 
    for(var i = 0; i < balls.length; i++) { 
     if(intersects(balls[current], balls[i]) == true){ 
//   balls[current].velocity.negate(); 
      alert('hey'); 
     } 
    } 
} 

、私はボール/衝突し、互いに交差していないことを確かに知っている、しかし、私は継続的に警告ボックスを取得する:これは私がこれまで持っているものです。私はそれが(sphere.radius + other.radius)よりも小さいかどうかを調べようとしましたが、それはうまくいかないので正しいとは思いません。また、私がそれを '< 4'のままにしておくと、パフォーマンスが低下し、約5fps以下でゆっくりと動き始める。 checkCollisionはアニメーション中にここで使用されるため、基本的に毎回チェックします。

function animate(){ 
    for(var i = 0; i < balls.length; i++){ 
     balls[i].position.add(balls[i].velocity); 
     checkWallBoundaries(i); 
     checkCollision(i); 
    } 

    THREEx.WindowResize(renderer, camera); 
    requestAnimationFrame(animate); 
    renderer.render(scene, camera); 
    controls.update(); 
    stats.update(); 
} 

なぜ私はこれを動作させることができないのかわかりません。誰かが私を助けることができれば、それは大いに感謝されるでしょう。

編集:ボールのコメントを外したときの画像です。現在の.velocity.negate()の行https://puu.sh/uG1eS.pngです。ボールは前後に進んでいるが、遠く離れていないので、なぜ衝突が検出されているのかわからない。

+0

、除外する必要がある理由はない 'リターン(距離<4);'と '場合([現在]交差(ボール、ボール[i])と)'余分なブール値は必要ありません。 'x-x''次元ごとにvarを使用すると、'> 4'は衝突を保証しないので、すぐに戻ります。そうでなければ、 'sqrt'にはvarを2回計算するのではなく使ってください。 '2 * radius'が動作しないのはなぜですか?すべてのオブジェクトにプロパティが設定されていますか?シミュレーションを設定するには、使用できるグローバル定数がありますか? –

+0

私はあなたがプロパティセットを持っていると言ったときにあなたが何を言っているかについてはあまりよく分かりませんが、 'var geometry = new THREE.SphereGeometry(2,32,32);'のように作成しました。あなたが見たい場合は球、https://puu.sh/uG2XA.png。私はそれを 'ボール[私] .radius'と呼んでいると信じていますが、私はあまり確信していません。また、助けてくれてありがとうございます。 – Quazi

+0

はい[SphereGeometry(radius、widthSegments、heightSegments)](https://threejs.org/docs/#Reference/Geometries/SphereGeometry)ので、最初のパラメータあなたのコンストラクタの呼び出しでは半径です。 'var SPHERE_RADIUS = 2;'と '新しいTHREE.SphereGeometry(SPHERE_RADIUS、32,32)'を定義し、あなたのテストは 'distance <(2 * SPHERE_RADIUS)'です。半径を変えてボールを作成すると、 'sphere.radius + other.radius'が必要になります。 'console.log'を使っていくつかのメッセージを書き出して、何が起こっているのかを見ることができます。 –

答えて

0

すべてのボールがそれ自身と衝突する。あなたは、パフォーマンスのためにi === current

for(var i = 0; i < balls.length; i++) { 
    if(current === i) continue; 
    if(intersects(balls[current], balls[i]) == true){ 
     alert('hey'); 
    } 
} 
+0

ああありがとう!これでうまくいけば問題が解決するはずです。私はそれを排除する方法について知っていますか?以来、私は配列のリストからボールを​​削除することはできません – Quazi

+0

'current === i'のチェックを含めるように更新されました – Tashi

+0

ありがとうTashi!だから、基本的には次の繰り返しに進み、完全に終了します。だからこそ私はそれがうまくいったのです。 – Quazi

関連する問題