我不擅长数学(我从来没有)并且我遇到了一个问题:我正在尝试让精灵始终旋转到鼠标光标。这就是我所拥有的:
// mx is mouse X and my is mouse y
double rotate = (atan2(my, mx) * PI);
// Set rotation takes rotation in degrees
ship.SetRotation( rad2deg(rotate) );
deg2rad
函数在哪里:
double rad2deg(double rad)
{
double deg = 0;
deg = rad * (180/M_PI);
return deg;
}
不幸的是它不起作用。这艘船旋转非常奇怪(很难定义)。我也不知道要解决这个问题。
我正在研究SFML,SetRotation
需要学位。
提前致谢。
答案 0 :(得分:5)
您需要相对于某个点定义旋转。目前你正在相对于屏幕的角落这样做,它只会给你90度,可能不是你想要的。您可能希望相对于精灵的位置或相对于屏幕中心的旋转,例如
// define centre of screen
const int Y0 = SCREEN_HEIGHT / 2;
const int X0 = SCREEN_WIDTH / 2;
// get rotation angle of mouse location relative to centre of screen
double rotate = (float) (atan2(Y0 - my), ((mx - X0));
[正如其他人所说,例如@duffymo,你也可能有atan2转换的参数,所以我也做了这个改变。]
答案 1 :(得分:3)
atan2似乎有错误的参数顺序。您传递给atan2
的值也应该是对象的相对鼠标位置。因此,如果对象位置为ox
,oy
,那么您应该使用atan2(my-oy, mx-ox)
。
答案 2 :(得分:2)
我想知道你是否有atan2反驳的论点。典型的顺序是先y,然后是x。你确定你知道你传递给那种方法的是什么吗?
“不工作”和“怪异”并不能帮助我们理解问题所在,所以很难帮助你。