cannon.js如何限制刚体球心在一个平面上运动

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

看起来有效果,但是球有点抖,因为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)
    });

试试,有效果。

你可能感兴趣的:(微信小游戏,Javascript)