首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Cannon.js中禁用实体碰撞

在Cannon.js中禁用实体碰撞
EN

Stack Overflow用户
提问于 2019-04-09 07:38:15
回答 1查看 1K关注 0票数 0

我有一堆平面,它们拼接在一起形成地形。每个单独的平面都有它自己的cannon.js主体(我使用three.js来渲染视觉效果)来进行碰撞。由于内存限制,当玩家移动到远离对象的位置时,我会取消渲染每个对象。我可以很容易地在three.js中取消渲染对象,只需将它们变为不可见,但在cannon.js中没有明确的方法来做到这一点。基本上,我想禁用一个cannon.js对象,而不是彻底删除它。

我已经看过文档了,基本上没有关于如何做到这一点的内容。我也没有看到关于这个主题的任何形式的问题。

下面的示例代码向您展示了我希望如何实现这一点。

代码语言:javascript
复制
//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();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-11 01:05:00

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

代码语言:javascript
复制
world.removeBody(groundBody);

要再次添加它,请运行:

代码语言:javascript
复制
world.addBody(groundBody);

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55583217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档