cannon.js的地址:http://schteppe.github.io/cannon.js/
这几天在写一个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) });试试,有效果。