cannon.js的地址:schteppe/cannon.js @ GitHub
这几天在写一个3D游戏:
球从y轴掉下来,堆叠后,因为重力原因,可能会向x,y,z三个轴随机跌落,但我只想要它在x和y轴跌落,不要在z轴跌落。
让球在一个平面上运动,很容易做到,增加一个CANNON.Plane就可以。
但是要让各种大小的球的球心在一个平面运动,如何做呢?
查了官方API,没有查到方法,自己在render时把全部body的position.z设置为0:
//限定球体只在y平面上
for (let i=0;i<bodies.length;i++){
bodies[i].position.z=0;
}
看起来有效果,但是球有点抖,因为world.step()把球向xyz任意轴移动后,可能z轴有位移,而我在render时又强制纠正回来,下次又移动又纠正,所以感觉会抖动。能不能在world.step()函数中就不要往z轴移动呢?
查到这个帖子:https://github.com/schteppe/cannon.js/issues/151
作者说有加参数linearFactor和angularFactor来支持这种需求,大喜,但是下载下来的cannon.js-master.zip中的cannon.min.js中的代码没有这2个参数,作者说要自己编译,没找到编译方法。
又查到其它人在维护的一个分支版本:https://www.npmjs.com/package/cannon-es,下载查看,有这2个参数。
let sphereBody = new CANNON.Body({
mass: 0,//getBallMass(value),//1公斤
//只有设置了DYNAMIC后,改变重量才有下坠效果
type:CANNON.Body.DYNAMIC,
//旋转阻尼系数,预设值0.01,设为1后就不旋转了
//angularDamping:0.8,
//直线阻尼系数,预设值0.01,影响下降速度
//linearDamping:0.8,
//是否不旋转
fixedRotation:false,
material:bodyMaterial,
//预告球的碰撞群组设置为2,用户点击后才设置为1,避免新产生的球马上碰撞在一起
collisionFilterGroup:2,
collisionFilterMask:1,
//新加的参数,可以限制只在2个轴上运动
linearFactor: new CANNON.Vec3(1,1,0),
//angularFactor: new CANNON.Vec3(1,1,0)
});
试试,有效果。