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 angle rotationの記事を見つけましたが、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_invI2.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 に答える
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 に答える