3

我正在专门寻找当世界重力(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 确实会使事情反弹,但是每次碰撞后的方向和速度都不是预期的。

感谢您的时间。

贾里德

4

2 回答 2

1

代替

    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 })
}

当 world.gravity 设置为 0 时,此 hack 将使用 applyGravity 内部 matterjs 引擎函数在方向 vx、vy 上正确应用推动运动

问候, 雅克

于 2018-06-12T17:51:39.240 回答
0

您需要将摩擦静态设置为1

physics: {
    frictionAir: 0,
    friction: 0,
    frictionStatic: 1,
    inertia: Infinity,
    restitution: 1,
    label: 'circle'+Date.now()+Math.random(),
    collisionFilter: {
       mask: 0x001
    },
},
于 2018-03-27T20:32:28.583 回答