2017-03-12 3 views
0

나는 Brownian Motion을 시뮬레이션하기 위해 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 * radius'가 작동하지 않는 이유는 무엇입니까? 모든 객체에 속성이 설정되어 있습니까? 시뮬레이션을 구성하는 데 사용할 수있는 전역 상수가 있습니까? –

+0

당신이 속성 집합을 가지고 있다고 말할 때 나는 당신이 무엇을 말할지 모르겠지만, 이렇게 만들었습니다 :'var geometry = new THREE.SphereGeometry (2, 32, 32);' sphere를보고 싶다면, https://puu.sh/uG2XA.png. 나는 그것을 '볼 (ball)'이라 부르 겠지만, 나는 그렇게 확신하지는 않는다. 또한 도움을 주셔서 감사합니다. – 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)'입니다. 반경이 다른 볼을 만들면 '구체 = 반경 + 다른 반경'이 필요합니다. '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

Ohhhh 정말 고마워요! 이것으로 문제가 해결 될 것입니다. 내가 어떻게 그것을 제외시킬 수 있는지 알고 있니? 이후 배열의 목록에서 공을 제거 할 수 없으므로 – Quazi

+0

업데이트 된 대답은'current === i'에 대한 검사를 포함하도록 – Tashi

+0

감사합니다! 따라서 기본적으로 다음 i 반복으로 넘어 가고 완전히 중단됩니다. 그것이 내가 생각했던 것입니다. – Quazi