javascript - 在 Cannon.js 中禁用 body 碰撞

标签 javascript three.js cannon.js

我有一堆飞机,它们组合在一起形成地形。每个单独的飞机都有自己的 cannon.js 主体(我使用 Three.js 来渲染视觉效果)以进行碰撞。由于内存限制,当玩家移动到远离对象时,我会取消渲染每个对象。我可以在 two.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();

最佳答案

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

world.removeBody(groundBody);

要再次将其添加回来,请运行:

world.addBody(groundBody);

像这样删除并添加回来是完全可以的。它将帮助您在运行 word.step() 时获得更好的性能。

关于javascript - 在 Cannon.js 中禁用 body 碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55583217/

相关文章:

javascript - 将 javaScript 对象转换为不同的对象类型

javascript - Three.js 保持相机在物体后面

javascript - 为什么我定义的字符串打印到控制台时显示为未定义?

javascript - Google Charts - 饼图的自定义工具提示值

javascript - 路由器导出的 Angular 2 延迟渲染

javascript - 将立方体面绘制为一个整体,而不是构成面的三 Angular 形 - Three.js

javascript - 从 THREE.Mesh 或 THREE.Geometry 创建 CANNON.RigidBody

javascript - float 菜单 CSS/Javascript 问题

javascript - 在 Three.js 中将 Material 设置为网格的固定部分

javascript - 用 Three.js 画一个基本的三 Angular 形