私が作成しているゲームでは、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));