OpenGL向一个点旋转

时间:2011-02-04 14:06:47

标签: c++ math opengl

使用openGL(仅2d),我正在尝试旋转纹理,使其指向屏幕上的某个点。我将首先展示一张图片,以帮助我解释。

http://img692.imageshack.us/img692/3088/probe.png

假设我的纹理是第1点的蓝点,它在第2点移动到目的地。我想旋转#1,使其“指向”第2点(纹理是一只鸟,所以它有一个定义“前面”)。要做到这一点,我需要找出角度3.同样,如果我的鸟在第4点朝向第5点行进,我需要计算角度6。

这样做的秘诀是什么?

2 个答案:

答案 0 :(得分:6)

解决方案是超级有用的std::atan2函数。从鸟的目标位置减去当前位置,并将yx(注意顺序!)填入atan2以获得角度。

编辑:请注意,atan通常假设0°位于X +轴(右侧)。但是,您似乎将“基本方向”与Y +对齐(向上),因此您可能希望减去90°或者将参数的顺序和符号与atan函数混合(使用圆形中的基本对称,即{ {1}})。

答案 1 :(得分:2)

假设您的目标位置在T处,并且您的精灵位置为P,则向量T-P指向从P到T的方向。因此,您必须在该方向上对齐纹理。你不需要为此做三角学!所以这是怎么回事:

T.x和T.y是T的x和y位置,并且与P的P.x和P.y相同。矢量T-P => (T.x-P.x,T.y-P.z)= D_l。我们希望对该向量进行归一化,这可以通过使用1 /长度(D_l)缩放向量的元素来完成。所以我们通过

获得D_l
D.x = D_l.x / sqrt( D.x^2 + D.y^2 ) = (T.x - P.x) / sqrt( (T.x - P.x)^2 + (T.y - P.y)^2 )
D.y = D_l.y / sqrt( D.x^2 + D.y^2 ) = (T.y - P.y) / sqrt( (T.x - P.x)^2 + (T.y - P.y)^2 )

只是为了完成

D.z = 0

所以D现在是包含朝向目标的方向的向量,即精灵的向上方向。现在我们需要正确的方向。我们现在可以用斜面做一些花哨的技巧,但是有一种更精简的方法:我们想要找到垂直于方向矢量所跨越的平面的向量和向下看到场景的向量,即Z方向。即我们想要找到产生双向D×Z = B

的叉积

记住交叉乘积的定义,并考虑Z.x = Z.y = 0,Z.z = 1

B.x = D.y · Z.z - D.z · Z.y =  D.y
B.y = D.z · Z.x - D.x · Z.z = -D.x
B.z = D.x · Z.y - D.y · Z.x = 0

就像预期的B.z = 0.从这里你可以创建旋转矩阵:

B.x   D.x   0   0 
B.y   D.y   0   0 
 0     0    1   0 
 0     0    0   1 

 =

 D.y   D.x   0   0
-D.x   D.y   0   0 
  0     0    1   0 
  0     0    0   1 

是正交矩阵,因此描述了旋转。您可以使用glMultMatrix应用此矩阵的旋转,或者如果您也想在其中放置位置,则使用glLoadMatrix

加载以下变量
B.x   D.x   0   P.x
B.y   D.y   0   P.y
 0     0    1   P.z
 0     0    0    1