【发布时间】:2015-01-17 21:38:24
【问题描述】:
对于我正在制作的游戏,我想要 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));
【问题讨论】:
-
您的问题将是 360 度左右。如果您的
angle是 359,但您的rot是 3 度,它应该向右转 4 度,而不是向左转 356 度。 -
您需要确定每个方向(CW/CCW)所需的旋转,然后选择较小的那个。
-
另一个旋转计算使用:vec2 distance = position - *desiredPosition;对吗?