Matter.js如何在一个无重力的盒子里使圆形物体(身体)无限弹跳(完美弹性)

5

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

感谢您的时间。

Jared


1
嗨,贾里德 - 我也对此很感兴趣,不知道你有没有什么进展? - Frank
仍在努力中 :) - Jared Tomaszewski
3个回答

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

这个技巧将使用applyGravity内部matterjs引擎函数,以正确地在vx、vy方向上应用推力运动,当world.gravity设置为0时。
敬礼,Jacek

我明白这个方法为什么能行(即看起来正确),但我无法弄清楚更新函数应该放在哪里...你能详细说明一下吗? - Xan-Kun Clark-Davis

0

你需要将frictionStatic设置为1

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

不起作用。老实说,我看不出为什么这个解决方案会起作用。也许如果重力非零会有所帮助。但是,如果y重力为1,似乎所有东西都会无限弹跳,但我必须在x和y重力为0的情况下实现此行为(我注意到我在问题中没有表述清楚-现在进行更正)。 - Jared Tomaszewski

0
但是身体只是慢慢地移动到盒子的边缘(由静态矩形构成),然后要么沿着边缘滑动到角落,要么完全停止而不发生任何反弹。
虽然有点晚了,但这个问题可以通过将matterjs配置中的restingThresh设置为低于默认值(4)来解决。在我的情况下(一个打砖块游戏),将其设置为0.1就解决了我的问题。
请参考以下问题: https://github.com/liabru/matter-js/issues/394

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接