Matter.js如何让身体(圆圈)在0重力的盒子中无休止地弹跳(完美的弹性)

时间:2018-01-16 19:22:15

标签: javascript matter.js

我特别寻找在世界引力(x和y)都为0时可行的身体选项。 我目前的身体选项如下:

physics: {
    frictionAir: 0,
    friction: 0,
    frictionStatic: 0,
    inertia: Infinity,
    restitution: 1,
    label: 'circle'+Date.now()+Math.random(),
    collisionFilter: {
      mask: 0x001
    },
},

尝试了各种组合,包括不断应用setVelocity和/或applyForce,但这些组合并没有按预期工作。我希望只应用一次setVelocity会让所有的身体永远保持活力。所以在我的update函数中,我做了类似的事情:

        if(!this.setInMotion){
            Matter.Body.setVelocity(myBody, 
                {x: (Math.random() - 0.5) * 2, 
                y: (Math.random() - 0.5) * 2})
            this.setInMotion = true
        }

但是这些物体只是(缓慢地)移动到盒子的侧面(由静态矩形构成),并且沿着它们向其角落滑动,或者完全停止而不会弹跳。 设置setAngularVelocity会使事情反弹,但每次碰撞后的方向和速度都不会达到预期的效果。

感谢您的时间。

贾里德

2 个答案:

答案 0 :(得分:0)

您需要将frictionStatic设置为 1

physics: {
    frictionAir: 0,
    friction: 0,
    frictionStatic: 1,
    inertia: Infinity,
    restitution: 1,
    label: 'circle'+Date.now()+Math.random(),
    collisionFilter: {
       mask: 0x001
    },
},

答案 1 :(得分:0)

替换

    if(!this.setInMotion){
        Matter.Body.setVelocity(myBody, 
            {x: (Math.random() - 0.5) * 2, 
            y: (Math.random() - 0.5) * 2})
        this.setInMotion = true
    }

if (!this.setInMotion) {
    this.setInMotion = true
    var vx = 0.001 * (Math.random() - 0.5)
    var vy = 0.001 * (Math.random() - 0.5)
    Matter.Engine._bodiesApplyGravity([myBody], { x: vx, y: vy })
}

这个hack将使用applyGravity inner matterjs引擎函数在world.gravity设置为0时正确地应用vx方向的推动,vy

此致,Jacek