0

私が作成しているゲームでは、3 隻の船が必要です。これらの船はすべて、ポイントのコレクションに従ってマップ内でレースをします。時計回りに 10 度だけで十分なはずなのに、船がほぼ 360 度反時計回りに回転することを決定したマップ内の 1 つのポイントを除いて、これは完全に正常に機能します。

回転を計算するためのコード:

vec2 distance = *desiredPosition - position;
float rot = atan2(distance.y, distance.x);
rot = rot * 180.f / PI + 90.f;

if (rot < angle)
{
    angle -= dAngle;
    boat->RotateImage(-dAngle);
}
if (rot > angle)
{
    angle += dAngle;
    boat->RotateImage(dAngle);
}

velocity += vec2(acceleration * cos((angle - 90) * PI / 180.0), acceleration * sin((angle - 90) * PI / 180.0));

そこで間違った方向に回転しないようにするにはどうすればよいですか?


Richard Byron のおかげで (以下の受け入れられた回答)、問題は修正されました。度数を使用するよりも内積を取る方が優れています。

最終的なコード:

vec2 distance = desiredPosition - position;
normal = vec2(sin((angle - 90) * PI / 180.0), cos((angle - 90) * PI / 180.0) * -1);
float dir = normal.x * distance.x + normal.y * distance.y;

//turn
if (dir > 0)
{
    angle -= dAngle;
    boat->RotateImage(-dAngle);
}
if (dir < 0)
{
    angle += dAngle;
    boat->RotateImage(dAngle);
}

velocity += vec2(acceleration * cos((angle - 90) * PI / 180.0), acceleration * sin((angle - 90) * PI / 180.0));
4

2 に答える 2

2

ボートの旋回角度は、時計回りでも反時計回りでも 180 度未満でなければなりません。一方向に 180 度以上回転する場合は、反対方向に回転させたほうがよいでしょう。

より一般的な解決策は、ボートの座標系に対する距離ベクトルを計算することです。

于 2015-01-14T16:25:35.527 に答える