C ++ AI轮换问题

时间:2015-01-14 15:38:59

标签: c++ rotation game-ai

对于我正在制作的游戏,我想要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));

2 个答案:

答案 0 :(得分:2)

船转角应小于180度CW或CCW。如果它在一个方向上转动超过180度,那么转向另一个方向会更好。

更通用的解决方案是计算相对于船的参照系的距离矢量。

答案 1 :(得分:1)

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

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

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