在Cannon.js中禁用身体碰撞

时间:2019-04-08 23:38:15

标签: javascript three.js cannon.js

我有一堆能组合在一起形成地形的飞机。每个平面都有其自己的cannon.js主体(我使用three.js来渲染视觉效果)进行碰撞。由于内存的限制,当播放器远离对象时,我会渲染每个对象。我可以通过将它们变为不可见状态来轻松地在three.js中解除渲染对象,但是在cannon.js中尚无明确的方法。基本上,我想禁用cannon.js对象而不将其彻底删除。

我已经浏览了文档,基本上没有关于如何执行此操作的信息。在该主题的任何形式上,我也没有发现任何疑问。

下面的示例代码向您展示我如何实现此目标。

//terrain generation
for (z=0; z<6; z++) {
 for (x=0; x<6; x++) {

 //cannon.js hitbox creation
 var groundShape = new CANNON.Box(new CANNON.Vec3(2,0.125,2));
 var groundBody = new CANNON.Body({ mass: 0, material: zeromaterial});
 groundBody.addShape(groundShape);
 groundBody.position.set(x*4,0,z*4);
 world.addBody(groundBody);
 maparray.push(groundBody);

 //three.js plane creation
 grassmesh = new THREE.Mesh(grassgeometry, grassmaterial);
 grassmesh.castShadow = true;
 grassmesh.receiveShadow = true;
 grassmesh.position.set(x*4,0,z*4);
 scene.add(grassmesh);
 maparray.push(grassmesh);
 }
}
...
function animate() {
 //detect if player is outside of loadDistance of object
 for(i=0; i<maparray; i++){
  if(Math.abs(maparray[i].position.x - player.position.x) <  
  loadDistance && Math.abs(maparray[i].position.z - 
  player.position.z) < loadDistance) {

   //code here magically turns off collisions for object. 

  }
 }
}
animate();

1 个答案:

答案 0 :(得分:1)

要从仿真中排除CANNON.Body,请运行以下命令:

world.removeBody(groundBody);

要再次添加它,请运行:

world.addBody(groundBody);

最好将其删除并重新添加回去。运行word.step()时,它将帮助您获得更好的性能。