【问题标题】:Stop Body Rotation in PhysicsJS在 PhysicsJS 中停止身体旋转
【发布时间】:2015-02-06 05:54:30
【问题描述】:

我正在寻找阻止 PhysicsJS 主体旋转的最佳实践方法。 我试过取消身体的旋转速度。然而,这在台阶上似乎并不有效,因为身体仍然以某种方式偷偷地进行一些旋转。将其与手动设置身体的旋转相结合一开始似乎可行:

world.on('step', function(){
    obj.state.angular.pos = 0;
    obj.state.angular.vel = 0;
    world.render();
});

但是在过去我遇到了很多与此方法相关的错误。似乎与在调用步骤之前允许对象稍微旋转有关,这导致它在其body.state.angular.pos 设置回零时非常快速地“旋转”。这导致物体突然发现自己在主体内部,或者主体突然发现自己在墙壁/其他物体内部。您可以想象,这不是一个理想的情况。

我也觉得如此用力地设置身体的旋转一定不是最好的方法,但我想不出更好的方法。所以我想知道 PhysicsJS 中是否有一些我还没有发现的方法,基本上只是声明“这个对象不能旋转”,但仍然允许在所有其他方面将身体视为动态的。

或者,什么是获得预期效果的“最安全”方法,即使有一个不是为physicsJS量身定制的通用指南,我也会很高兴,只是为了让我了解控制动态身体旋转的一般最佳实践是什么在模拟中。

提前感谢您的任何建议!

【问题讨论】:

    标签: javascript html canvas physicsjs


    【解决方案1】:

    实现这一点的关键是确保你先让身体进入睡眠状态,然后立即将其唤醒,然后将角速度设置为零。

    例如,为了防止碰撞的物体旋转,我一直在做的事情是:

      world.on('collisions:detected', function(data, e) {
        var bodyA = data.collisions[0].bodyA,
            bodyB = data.collisions[0].bodyB;
    
        bodyA.sleep(true);
        bodyA.sleep(false);
        bodyA.state.angular.vel = 0;
    
        bodyB.sleep(true); 
        bodyB.sleep(false); 
        bodyB.state.angular.vel = 0;
      });
    

    我也看到了通过将相关物体的质量增加到一个高得离谱的数字来实现这一点,但这可能会产生你可能不希望的副作用。

    【讨论】:

    • 有趣,我认为这会阻止所有碰撞响应触发,您能否解释一下为什么不是这样?
    • 不,因为您会先让身体进入睡眠状态,然后立即将其唤醒。当然,如果您想有选择地添加此行为,则必须确定主体并仅将其应用于它们。
    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    相关资源
    最近更新 更多