我到处搜索并查看了很好的问题和文档,但似乎在两个Cannon机构之间创建约束,没有办法对不同质量的形状进行分组(例如)。
目前我使用的是lockConstraint
,但那是一个黑客......有时,当我的物体发生碰撞时,"""""&#的轮换34;物体在不需要的位置突然旋转......
有更合适的方法吗?
编辑:我想要实现的目标是:我创造了一辆车,我希望他的质量中心位于4个车轮的中心位置。
为此,我创建了一个.collisionResponse
设置为0的物体和我想要的质量,并将其定位在车轮中心。
然后我创建了一个质量非常小的新机箱CANNON.LockConstraint(chassisBody, mass, 0.5)
,它允许2个对象"分组"。
答案 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);