2

そのため、プレーサーを惑星に向けるのに問題があります。プレイヤーと惑星の間の角度があり、プレイヤーが現在いる角度もあります。これらでやりたいことは、プレイヤーが惑星に面するようにすることですが、段階的な変化があります。(これを行うのは、プレーサーが惑星を周回できるようにするためです)

問題は数学にあります。プレーヤーと惑星の間の角度に一致するようにプレーヤーの回転をインクリメントしますが、角度は 0 から 360 で機能するため、プレーヤーの回転は 2 である可能性があるため、プレーヤーは周回しませんが、惑星への角度は 280 であるため、ゲームはプレイヤーを好転させます。悪い説明で申し訳ありません。

プレイヤーが私の惑星を周回する方法を知っている人はいますか?

これが私のコードです:

double rotation = Math.toDegrees(Math.atan2(currentPlanet.pos[1]-currentPlayer.pos[1], currentPlanet.pos[0]-currentPlayer.pos[0]));
if(rotation < 0)
{
    rotation += 360;
}

if(currentPlayer.rotation < rotation)
{
    currentPlayer.rotation += 0.15*delta;
}

if(currentPlayer.rotation > rotation)
{
    currentPlayer.rotation -= 0.15*delta;
}
4

2 に答える 2

3

問題は350°も-10°であるということです。より小さな絶対値が必要です。

解決策は非常に簡単です。モジュロ演算を使用して、角度を正しい範囲に変換します。

/* returns angle x represented in range -180.0 ... 180.0 */
double clampAngle(double x) {
    return (x%360.0+360.0+180.0)%360.0-180.0;
}

角度差をこの関数に渡します。結果のサインは、あなたがどちらの方向に向けるべきかを教えてくれます:

double rotation = Math.toDegrees(Math.atan2(currentPlanet.pos[1]-currentPlayer.pos[1], currentPlanet.pos[0]-currentPlayer.pos[0]));
double diff =  ((rotation-currentPlayer.rotation)%360.0+360.0+180.0)%360.0-180.0;   

if(diff>0)
    turn right
else
    turn left

abs(diff)が非常に小さい場合は、まったく向きを変えたくない場合があります。

それがあなたのプレイヤーをあなたの惑星の軌道に乗せるかどうかはわかりません。正しい角速度と線速度を設定する必要があります。

于 2012-07-14T19:20:31.850 に答える
1

必要なのは、惑星とプレーヤーの間で計算した角度のプラスマイナス90度のいずれかに面するように、プレーヤーを回転させることです。軌道は、すべての動きが惑星に接している(90度)ときに発生します。

したがって、角度を計算し、プレーヤーの角度を+90と-90の両方と比較して、プレーヤーを2つのうち近い方に回転させます。

于 2012-07-14T19:19:42.833 に答える