0

私は自分の車の動きを整理するためにこのサイトに行ってきました。http://www.helixsoft.nl/articles/circle/sincos.htm

使用した罪と余弦のせいで、車を円を描くように動かすだけで問題が発生しました。サイトでは固定小数点数を使用しており、浮動小数点を使用したいのですが、正しく実行できたと思います。

これが私のコードです

    if(myEngine->KeyHeld(Key_W))
    {
        length -= carSpeedIncrement;
    }
    if(myEngine->KeyHeld(Key_S))
    {
        length += carSpeedIncrement;
    }
    if(myEngine->KeyHeld(Key_A))
    {
        angle -= 0.01f;
    }
    if(myEngine->KeyHeld(Key_D))
    {
        angle += 0.01f;
    }

    carVolocityX = length * (sin(angle));
    carVolocityZ = length * (cos(angle));

    carPositionX += carVolocityX; 
    carPositionZ += carVolocityZ; 

    car[0]->MoveX((carPositionX * sin(angle)) * frameTime);
    car[0]->MoveZ((carPositionZ * cos(angle)) * frameTime);

私はこの動きをどのように行うかについての新しいアイデアを受け入れていますが、ベクトルを使用する必要があります。anyouneは私がこれでどこが間違っているのかを見ることができます。

どんな助けでも大歓迎です。

4

2 に答える 2

1

MoveXとMoveZについてあなたが言ったことに基づいて、問題は、速度を期待している関数に絶対位置を渡そうとしていることだと思います。試す

car[0]->MoveX(carVolocityX * frameTime);
car[0]->MoveZ(carVolocityZ * frameTime);
于 2012-04-05T20:40:05.577 に答える
0

速度ベクトルを計算するときと、車の新しい位置を計算するときに、sin と cos の両方を適用するのはなぜですか?

コードは、キーボードを使用して車を運転しようとしているように見えます。そんなときは、これを試してみてください

car[0]->MoveX((carPositionX) * frameTime);
car[0]->MoveZ((carPositionZ) * frameTime);

距離の実際の計算中に frameTime を適用する方が明確であることに注意してください。この編集をお勧めします。

carPositionX += carVolocityX * frameTime; 
carPositionZ += carVolocityZ * frameTime; 

car[0]->MoveX((carPositionX));
car[0]->MoveZ((carPositionZ));

代わりに、円を描くように動かしたいだけで、「A」と「D」が角度に影響を与えないようにする場合は、

car[0]->MoveX((carPositionX * sin(angularVelocity * totalTime)));
car[0]->MoveZ((carPositionZ * cos(angularVelocity * totalTime)));

キーを使用して (新しい) 変数 angularVelocity を調整するか、定数を割り当てて動作を確認することができます。変数 totalTime は、シミュレーションが開始されてからの合計時間です。

于 2012-04-05T18:48:54.960 に答える