如何在Cannon.js中对对象体(父/子)进行分组?

时间:2017-03-04 17:56:11

标签: javascript three.js cannon.js

我到处搜索并查看了很好的问题和文档,但似乎在两个Cannon机构之间创建约束,没有办法对不同质量的形状进行分组(例如)。

目前我使用的是lockConstraint,但那是一个黑客......有时,当我的物体发生碰撞时,"""""&#的轮换34;物体在不需要的位置突然旋转......

有更合适的方法吗?

编辑:我想要实现的目标是:我创造了一辆车,我希望他的质量中心位于4个车轮的中心位置。 为此,我创建了一个.collisionResponse设置为0的物体和我想要的质量,并将其定位在车轮中心。 然后我创建了一个质量非常小的新机箱CANNON.LockConstraint(chassisBody, mass, 0.5),它允许2个对象"分组"。

1 个答案:

答案 0 :(得分:2)

无法在Cannon.js中设置每个Shape的质量/密度。但是,您可以将质心移近更重的形状以获得相同的效果。

锤子就是一个很好的例子,因为在典型的锤子中,头部的密度远大于轴。如果你扔锤子,它会围绕靠近头部的点旋转,因为头部比轴重。

要在cannon.js中制作一把锤子,你可以使用两个盒子。

var head = new CANNON.Box(new CANNON.Vec3(2,1,1));
var shaft = new CANNON.Box(new CANNON.Vec3(0.5,3,0.5));

现在,要将形状组合成一个Body,你可以这样做:

var body = new CANNON.Body({ mass: 1 });
body.addShape(shaft, shaftPosition);
body.addShape(head, headPosition);

根据您使用的形状位置(shaftPosition,headPosition),您可以在Body中本地更改它们的位置,同时,它们相对于质心(也称为旋转中心)的位置。 设置headPosition =(0,0,0)和shaftPosition =(0,3,0)会使锤子在投掷锤子时绕着头部旋转。然而,如果你反过来说,锤子会围绕轴的中心旋转......看起来头部和轴的密度相似。尝试不同的位置,找到相对于形状的完美旋转中心。

Body#addShape的完整签名允许您添加完整的刚性变换以在体内定位形状。它是:

body.addShape(shape, position, quaternion);