在 Cannon.js 中禁用 body 的碰撞
Disable collision of body in Cannon.js
我有一堆平面可以组合在一起形成地形。每个单独的平面都有自己的 cannon.js
body(我使用 three.js
来渲染视觉效果)进行碰撞。由于内存限制,我 de-render 每个 object 当玩家移动到远离 object 时。我可以在 three.js
中轻松地 de-render objects 只需将它们隐藏起来,但在 cannon.js
中没有明确的方法可以做到这一点。基本上我想禁用 cannon.js
object 而不是完全删除它。
我已经查看了文档,基本上没有关于如何执行此操作的内容。我也没有看到关于此主题的任何形式的问题。
下面的示例代码向您展示了我想如何实现它。
//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);
像这样删除再添加回来是完全没问题的。当 运行ning word.step().
时,它将帮助您获得更好的性能
我有一堆平面可以组合在一起形成地形。每个单独的平面都有自己的 cannon.js
body(我使用 three.js
来渲染视觉效果)进行碰撞。由于内存限制,我 de-render 每个 object 当玩家移动到远离 object 时。我可以在 three.js
中轻松地 de-render objects 只需将它们隐藏起来,但在 cannon.js
中没有明确的方法可以做到这一点。基本上我想禁用 cannon.js
object 而不是完全删除它。
我已经查看了文档,基本上没有关于如何执行此操作的内容。我也没有看到关于此主题的任何形式的问题。
下面的示例代码向您展示了我想如何实现它。
//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);
像这样删除再添加回来是完全没问题的。当 运行ning word.step().
时,它将帮助您获得更好的性能