0

对于我正在制作的游戏,我想要 3 艘船,它们都将按照一系列点在地图上竞速。它工作得非常好,除了地图上的一个点,船决定逆时针旋转几乎 360 度,即使顺时针只有 10 度就足够了。

计算旋转的代码:

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 回答
1

您更新的代码存在一些问题。首先,应该是 rot2 = 360 - rot1;(rot1 + 360 与 rot1 的角度完全相同)。

第二个问题是您没有考虑到 1 度和 359 度几乎是同一个角度。所以如果 abs(rot1 - angle) > 180,那么在这种情况下你真的想使用 360 - abs(rot1 - angle)。出于同样的原因,您以后与 rot 和 angle 的比较是一个问题,您需要处理在 360 以上递增和在 0 以下递减的角度。

我可以为此编写代码,但实际上有一种更简单、更快捷的方法可以做到这一点。如果您将向量(desiredPosition - 位置)与与船舶当前航向成直角的向量相乘,则可以根据该结果的符号进行转向。如果不清楚如何执行此操作,请告诉我,我可以在评论中对其进行扩展。

于 2015-01-15T22:32:57.303 回答