2

我一直在尝试对 PlayN 中的 Body 对象应用角度脉冲,但无济于事。无论我输入哪个值(径向),身体的角度都不会改变。我也尝试设置扭矩,但没有结果。

不起作用的示例代码:

BodyDef def = new BodyDef();
def.type = BodyType.DYNAMIC;
Body body = world.createBody(def);

float degToRad = (float) (180 / Math.PI);
float radials = (float) (50 / degToRad);

// None of the following options work.
body.applyAngularImpulse(radials);       // Immediate angular change.
body.applyTorque(radials);               // Angular change over time.

如何在不手动设置角速度(例如使用 setAngularVelocity)的情况下获得有效的身体对象来改变其角度?

提前致谢!

我确实注意到通过调用 setWake 方法来重置扭矩和角速度,我从不手动执行该方法,但它是由 Island 类调用的:

public void setAwake(boolean flag) {
    ...
    m_angularVelocity = 0.0f;
    m_torque = 0.0f;
    ...
}

注意:设置角速度不是一个选项,因为我依赖于物理模拟。我找到了一篇关于 Box2D 角度旋转的文章,但它并没有改变 applyAngularImpulse 方法的结果。

4

3 回答 3

2

我已经调试了一些,得出的结论是我一直在使用的值太低了。在浏览 applyAngularImpulse 代码时,我注意到了一些事情:

public void applyAngularImpulse(float impulse) {
    if (m_type != BodyType.DYNAMIC) {
        return;
    }

    if (isAwake() == false) {
        setAwake(true);
    }
    m_angularVelocity += m_invI * impulse;
}

m_invI是一个非常低的值,例如2.44882598E-4所以如果我使用太低的值是有道理的,那就是没有可见的效果。如果计算问题示例乘以m_invI字段的脉冲:

m_invI                                 = 0.00044882598 = 2.449E-4
impulse          = 50 / 180 / PI       = 0.08841941282 = 8.842E-2
m_invI * impulse = 2.449E-4 * 8.842E-2 = 0.00002165237 = 2.165E-5 <--

这意味着每个更新周期只有0.00002165237的角速度增量......这似乎太低而无法注意到。

此外,在浏览 Box2D 论坛以了解类似情况时,我发现将身体的惯性纳入角脉冲计算是一种最佳做法。像这样:

body.applyAngularImpulse(speedValue * body.getInertia());

对我来说,惯性往往是一个很高的值(+4000)。

希望这可以对其他难以施加角脉冲或扭矩的人有所帮助。

于 2012-08-18T07:03:04.700 回答
2

就我而言,我忘了打电话

body.setFixedRotation(false);

即使我设置了质量,但报告的惯性为 0,并且忽略了所有扭矩和角脉冲。

显然它是默认固定的。

于 2014-11-16T19:52:45.603 回答
1

我有同样的问题。

就我而言,我不小心将我的点按 CW 顺序排列(导致负面积和零质量)。这是我的错误代码:

// incorrect version
triangleVertices.push(new B2Vec2(width / 2, 0.0)); // top
triangleVertices.push(new B2Vec2(0.0, height));    // left
triangleVertices.push(new B2Vec2(width, heightM)); // right

这看起来像CCW,对吧?不,不在我的坐标系中(+Y 向下)。

// corrected version
triangleVertices.push(new B2Vec2(width / 2, 0.0)); // top
triangleVertices.push(new B2Vec2(width, heightM)); // right
triangleVertices.push(new B2Vec2(0.0, height));    // left
于 2016-12-17T19:35:11.557 回答