用于围绕中心点旋转对象的功能

时间:2014-04-29 19:07:11

标签: c++ math

我正在尝试使用SFML在C ++中编写游戏,其中有几个太空飞船从不同侧面攻击行星。我希望攻击行星的太空船在攻击时(显然)能够面对行星。我遇到的问题是找出一个适用于每个x和y位置的公式。如果船的精灵从面朝上开始,那么最好的方法是什么?

例如,如果船舶在行星的右侧产生,船舶精灵应向左旋转,朝向行星的中心。

2 个答案:

答案 0 :(得分:1)

下面是轮换的数学,这是你似乎要求的,但是你最好只使用SFML的api来旋转实体:http://www.sfml-dev.org/tutorials/2.0/graphics-transform.php


旋转原点周围的点可以表示为矩阵乘法,其中包含以下矩阵:

[[ cos(a), sin(a), 0],
 [-sin(a), cos(a), 0],
 [      0,      0, 1]]

其中a是要旋转的角度。

(这可以从三角形身份cos(a)sin(b)+ cos(b)sin(a)= sin(a + b)和cos(a)cos(b) - sin(a)得出sin(b)= cos(a + b))

平移点以使其位于您想要相对于原点旋转的位置也可以表示为矩阵乘法,当然也可以将其平移。

要在水平方向上按a转换点,在垂直方向转换b,将点[x,y,1]乘以矩阵

[[1, 0, 0],
 [0, 1, 0],
 [a, b, 1]]

这产生矩阵[x + a,y + b,1],它是转换点(x + a,y + b)。

要为一个点(C x ,C y )周围的旋转准备一个点,首先将其翻译为-C x 在水平方向上,-C y 在垂直方向上。其矩阵为[[1,0,0],[0,1,0],[-C x ,-C y ,1]]。在旋转之后,您在相反的方向上转换相同的量,这与乘以逆矩阵相同:[[1,0,0],[0,1,0],[C x ,C y ,1]]。

假设您的初始点是p,矩阵A将其转换为相对于旋转原点,矩阵R围绕原点旋转。然后你的旋转点是

((p×A)×R)×A -1


由于矩阵乘法是关联的,您可以将其重新排列为:

p×((A×R)×A -1

这意味着您可以计算矩阵ARA -1 ,然后将该矩阵乘以任何点以围绕公共中心旋转该点。因此,对于要旋转的每个对象,计算围绕对象中心点旋转点的矩阵,然后使用矩阵旋转该对象的每个点。

当您将平移矩阵与旋转矩阵组合时get一个矩阵:

[[                         cos(a),                          sin(a), 0],
 [                        -sin(a),                          cos(a), 0],
 [-cos(a) * Cx + Cx + Cy * sin(a), -cos(a) * Cy + Cy - Cx * sin(a), 1]]

将此点(x,y)乘以此矩阵会产生一个带x坐标的点:

x×cos(a) - y×sin(a)+(-cos(a)×C x + C x + C y < / sub>×sin(a))

和y坐标:

x×sin(a)+ y×cos(a)+( - cos(a)×C y + C y - C x < / sub>×sin(a))


要尝试这一点,请说我们想要围绕(1,1)旋转点。如果我们用pi / 2(逆时针90°)旋转点(2,1),我们应该得到点(1,2),旋转点(2,1)应该给我们(0,1)。 / p>

将坐标(2,1)和角度pi / 2插入到旋转的x坐标的等式中会产生:

2 * cos(pi / 2) - 1 * sin(pi / 2)+ -cos(pi / 2)* 1 + 1 + 1 * sin(pi / 2)= 1

并将它们插入y坐标的等式中会产生:

2 * sin(pi / 2)+ 1 * cos(pi / 2)+(-cos(pi / 2)* 1 + 1 - 1 * sin(pi / 2))= 2

这意味着在(1,1)周围旋转90°的点(2,1)是点(1,2),正如预期的那样。

然后插入点(1,2):

1 * cos(pi / 2) - 2 * sin(pi / 2)+ -cos(pi / 2)* 1 + 1 + 1 * sin(pi / 2)= 0

2 * sin(pi / 2)+ 1 * cos(pi / 2)+(-cos(pi / 2)* 1 + 1 - 1 * sin(pi / 2))= 1

产生点(0,1),这也是预期的。

答案 1 :(得分:0)

将行星的位置表示为(xP,yP),将船的位置表示为(xS,yS),其点朝上,方向(0,1)和#39; (表示转换为列向量的素数)。为了让船指向行星,我们需要它指向差异向量的相反方向

(x,y) = (xS-xP, yS-yP).

更确切地说,点的归一化方向应为(-x / r,-y / r)&#39;,使用r = sqrt(x ^ 2 + y ^ 2)。方向矢量(0,1)&#39;的旋转至(-x / r,-y / r)&#39;使用旋转矩阵

执行
( -y/r  -x/r )   ( 0 )    ( -x/r )
(  x/r  -y/r ) * ( 1 ) =  ( -y/r )

用于约定矩阵 - 向量 - 乘积。如果是矢量矩阵乘积,请使用它的转置。

如果直接指定矩阵,请使用它。使用旋转角度时,旋转角度为弧度atan2(x,-y)。