我正在使用three.js来模拟布朗运动,我被困在一个需要让小分子相互碰撞的部位。这就是我到目前为止所做的:
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)但我不认为这是正确的,因为它似乎不起作用。当我确实保持它'&lt; 4',它会影响性能,并且开始以大约5 fps或更低的速度慢慢运行。 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();
}
我不知道为什么我不能让这个工作。如果有人可以帮助我,那将非常感激。
编辑:这是我取消注释球[current] .velocity.negate()line https://puu.sh/uG1eS.png时会发生什么的图片。球继续前后移动,但它们甚至不能彼此靠近,所以我不知道为什么会发现碰撞
答案 0 :(得分:0)
每一个球都与自身发生碰撞。您需要排除i === current
for(var i = 0; i < balls.length; i++) {
if(current === i) continue;
if(intersects(balls[current], balls[i]) == true){
alert('hey');
}
}