나는 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의 주석을 제거하면 어떻게되는지 그림이 있습니다. 볼은 계속 앞뒤로 계속 지나가고 있지만 서로 멀리 떨어져 있지 않아 충돌이 감지되는 이유를 모르겠습니다.
제외해야하는 이유 없다'리턴 (거리 <4)'와'경우 ([현재] 교차 (공, 공 [I]))'여분의 논리 값에 대한 필요가 없습니다. 각'x - x '차원에 대해 var를 사용하면'> 4'는 충돌을 보장하지 않으므로 즉시 반환됩니다. 그렇지 않다면'sqrt'에 대해 var를 두 번 계산하는 대신 사용하십시오. '2 * radius'가 작동하지 않는 이유는 무엇입니까? 모든 객체에 속성이 설정되어 있습니까? 시뮬레이션을 구성하는 데 사용할 수있는 전역 상수가 있습니까? –
당신이 속성 집합을 가지고 있다고 말할 때 나는 당신이 무엇을 말할지 모르겠지만, 이렇게 만들었습니다 :'var geometry = new THREE.SphereGeometry (2, 32, 32);' sphere를보고 싶다면, https://puu.sh/uG2XA.png. 나는 그것을 '볼 (ball)'이라 부르 겠지만, 나는 그렇게 확신하지는 않는다. 또한 도움을 주셔서 감사합니다. – Quazi
예 [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'를 사용하여 어떤 메시지가 출력되는지 확인하십시오. –