如何在平面上适当地施加扭矩和角度冲击?

时间:2012-08-15 12:04:59

标签: playn jbox2d

我一直在尝试将角度脉冲应用到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;
    ...
}

注意:设置角速度不是一个选项,因为我依赖于物理模拟。我找到了article for Box2D angle rotation,但它没有改变applyAngularImpulse方法的结果。

3 个答案:

答案 0 :(得分: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)。

希望这对那些在施加角度冲击或扭矩方面遇到困难的人有所帮助。

答案 1 :(得分:2)

在我的情况下,我忘了打电话

body.setFixedRotation(false);

即使我设定了质量,也报告了0的惯性,忽略了所有扭矩和角度脉冲。

显然它默认是固定的。

答案 2 :(得分:0)

我遇到了同样的问题。

在我的情况下,我意外地将我的点按顺序排列(导致负面积和零质量)。这是我的错误代码:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {

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

// 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
相关问题