C++ C++;人工智能轮换问题

C++ C++;人工智能轮换问题,c++,rotation,game-ai,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) {

对于我正在制作的一个游戏,我想要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));
vec2距离=*desiredPosition-位置;
浮动旋转=atan2(距离y,距离x);
rot=rot*180.f/PI+90.f;
如果(旋转<角度)
{
角度-=悬挂;
船->旋转图像(-悬挂);
}
如果(旋转>角度)
{
角度+=悬挂;
船->旋转图像(悬挂);
}
速度+=vec2(加速度*cos((角度-90)*PI/180.0),加速度*sin((角度-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));
vec2距离=所需位置-位置;
法线=vec2(sin((角度-90)*PI/180.0),cos((角度-90)*PI/180.0)*-1);
float dir=normal.x*distance.x+normal.y*distance.y;
//转向
如果(dir>0)
{
角度-=悬挂;
船->旋转图像(-悬挂);
}
if(dir<0)
{
角度+=悬挂;
船->旋转图像(悬挂);
}
速度+=vec2(加速度*cos((角度-90)*PI/180.0),加速度*sin((角度-90)*PI/180.0));

船的顺时针或逆时针旋转角度应小于180度。如果它在一个方向上旋转超过180度,那么最好是向另一个方向旋转


更一般的解决方案是计算相对于船的参考系的距离向量

船舶顺时针或逆时针旋转的角度应小于180度。如果它在一个方向上旋转超过180度,那么最好是向另一个方向旋转


更一般的解决方案是计算相对于船的参考系的距离向量

船舶顺时针或逆时针旋转的角度应小于180度。如果它在一个方向上旋转超过180度,那么最好是向另一个方向旋转


更一般的解决方案是计算相对于船的参考系的距离向量

船舶顺时针或逆时针旋转的角度应小于180度。如果它在一个方向上旋转超过180度,那么最好是向另一个方向旋转


更一般的解决方案是计算相对于船的参考系的距离向量

更新后的代码有几个问题。首先,它应该是rot2=360-rot1;(rot1+360与rot1的角度完全相同)

第二个问题是没有考虑到1度和359度几乎是相同的角度。因此,如果abs(旋转1角)>180,那么在这种情况下,您确实希望使用360-abs(旋转1角)。出于同样的原因,您以后与rot和angle的比较也是一个问题,您需要处理角度增量大于360,递减小于0的情况


我可以为此编写代码,但实际上有一种更简单、更快的方法。如果取向量(desiredPosition-position)和与船舶当前航向成直角的向量的点积,则可以根据该结果的符号旋转。如果不清楚如何执行此操作,请告诉我,我可以在注释中对此进行详细说明。

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

第二个问题是没有考虑到1度和359度几乎是相同的角度。因此,如果abs(旋转1角)>180,那么在这种情况下,您确实希望使用360-abs(旋转1角)。出于同样的原因,您以后与rot和angle的比较也是一个问题,您需要处理角度增量大于360,递减小于0的情况


我可以为此编写代码,但实际上有一种更简单、更快的方法。如果取向量(desiredPosition-position)和与船舶当前航向成直角的向量的点积,则可以根据该结果的符号旋转。如果不清楚如何执行此操作,请告诉我,我可以在注释中对此进行详细说明。

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

第二个问题是没有考虑到1度和359度几乎是相同的角度。因此,如果abs(旋转1角)>180,那么在这种情况下,您确实希望使用360-abs(旋转1角)。出于同样的原因,您以后与rot和angle的比较也是一个问题,您需要处理角度增量大于360,递减小于0的情况


我可以为此编写代码,但实际上有一种更简单、更快的方法。如果取向量(desiredPosition-position)和与船舶当前航向成直角的向量的点积,则可以根据该结果的符号旋转。如果不清楚如何执行此操作,请告诉我,我可以在注释中对此进行详细说明。

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

第二个问题是没有考虑到1度和359度几乎是相同的角度。因此,如果abs(旋转1角)>180,那么在这种情况下,您确实希望使用360-abs(旋转1角)。出于同样的原因,您以后与rot和angle的比较也是一个问题,您需要处理角度增量大于360,递减小于0的情况

我可以为此编写代码,但实际上有一种更简单、更快的方法。如果取向量的点积(所需