2

ここにあるシステムを複製しようとしています: http://www.myphysicslab.com/collision.html

これまでのところ、これは私のコードです(動かせない壁のような無限大の物体にぶつかった場合):

public static Orientation collide( float bodyMass_1, float bodyVelocityX_1, float bodyVelocityY_1, float bodyAngleMomentum_1 , float pointXFromCenterX_1, 
float pointYFromCenterY_1, float momentOfInertia_1,
float edgeNormalX, float edgeNormalY, float elasticity )
{
    Orientation returning;

    float outAngleMomentum_1;

    float outVelocityX_1, outVelocityY_1;

    float relativeNormal;
    float deltaParameter;

    float pointVelocityX_1, pointVelocityY_1;

    pointVelocityX_1 = bodyVelocityX_1 - bodyAngleMomentum_1 * pointYFromCenterY_1;
    pointVelocityY_1 = bodyVelocityY_1 + bodyAngleMomentum_1 * pointXFromCenterX_1;


    System.out.println( edgeNormalX );
    System.out.println( edgeNormalY );

    relativeNormal = (float) Funct3D.dotProduct( pointVelocityX_1, pointVelocityY_1,edgeNormalX, edgeNormalY );


    if ( relativeNormal < 0 )
    {

        deltaParameter = (-(1 + elasticity) *( (float) Funct3D.dotProduct( pointVelocityX_1, pointVelocityY_1, edgeNormalX, edgeNormalY ) ))/ 
        ( 1/bodyMass_1 + Funct3D.sqr( (float) Funct3D.perpDotProduct(pointXFromCenterX_1,pointYFromCenterY_1,edgeNormalX,edgeNormalY)) / momentOfInertia_1 );

        outVelocityX_1 = bodyVelocityX_1 + deltaParameter * edgeNormalX / bodyMass_1;
        outVelocityY_1 = bodyVelocityY_1 + deltaParameter * edgeNormalY / bodyMass_1;

        outAngleMomentum_1 = bodyAngleMomentum_1 + (float)     Funct3D.perpDotProduct(pointXFromCenterX_1, pointYFromCenterY_1,     deltaParameter*edgeNormalX, deltaParameter*edgeNormalY ) / momentOfInertia_1;

        returning = new Orientation( outVelocityX_1, outVelocityY_1, outAngleMomentum_1 );
    }
    else
    {
        System.out.println( "NO COLLISION" );
        returning = new Orientation( bodyVelocityX_1, bodyVelocityY_1, bodyAngleMomentum_1 );
    }
    return returning;
}

私のコードの結果は、多くの場合、法線を介して速度が反映されないか、運動量の保存がまったくないという結果になります。実行直後に結果を出力しただけでも、結果は、衝突を数回登録する問題ではなく、最初の実行でも発生することを示しています。

dotProduct2 つのベクトルの内積を返します。

perpDotProduct2 つのベクトルの perp 内積を返します

説明が必要な場合、またはコードの範囲を広げてほしい場合は、お気軽にお問い合わせください。

4

1 に答える 1

1

この種のタスクでは、入力パラメーターをメソッドに渡し、有効であることがわかっている値をcollide期待する簡単なテストを作成することをお勧めします。Orientation

JUnit フレームワークまたは単純なmain方法を使用できます。

Orientation orientation = collide(a, b, c, d, ...);
assertEquals(KNOWN_X, orientation.getX());
assertEquals(KNOWN_Y, orientation.getX());
assertEquals(KNOWN_MOMENTUM, orientation.getMomentum());

このコードを使用すると、メソッドをデバッグし、アルゴリズムの各ステップで値が正しいことを確認できます。次に、既知の入力値と出力値の新しいセットを使用してアルゴリズムを確認できます。

また、コードをクリーンアップし、繰り返し計算をローカル変数に移動することも検討してください (つまりdeltaParameter * edgeNormalX)

于 2012-12-03T20:29:57.070 に答える