给出新旧位置计算角色转角 - OpenGL

时间:2014-12-06 14:12:49

标签: opengl math rotation coordinates line

我正在使用OpenGl开发一个游戏项目。我正在建立一个我在网上找到的骨架代码游戏。我有一个可以在2D平面中移动的角色。 (x和z,即你正在从上面查看角色。)我目前仍然坚持让他在移动时旋转,而我似乎无法找到解决我问题的在线解决方案。

在角色被绘制的那一刻,他面向某种方式(沿着下图中的箭头)。我可以使用glm :: rotate。将其从默认方向旋转任意数度。

我已经更新了代码,以便在移动时记录一帧之前的字符位置,所以我有这些信息:

character old position (known)->           O    
character starting angle (unknown)->       |\    
                                           | \   
                                           |  \
                                           |(X)\
                                           |    \
                                           V     O <- character new position (known)

如何计算角度(X)?是否有可能获得我的信息?

我一直在试图在最后一小时解决这个问题的页面上涂鸦,但似乎无法弄明白。非常感谢。

2 个答案:

答案 0 :(得分:1)

是。这个答案为您提供了如何执行此操作的示例:How to calculate the angle between a line and the horizontal axis? 但请注意,这将为您提供水平轴和点之间的角度。但是你可以添加90度。

答案 1 :(得分:1)

你在做什么听起来有点令人费解。从描述中,您似乎想要一个与方向匹配的旋转矩阵。实际上没有必要计算角度。您可以直接构建旋转矩阵,这样更容易,更有效。

我将用xy平面中的点/向量来说明计算,因为这更加标准。听起来你在xz平面上运行。虽然这不会改变太多,但您可能需要稍微更改,因为您有一个左手坐标系。

如果您有方向向量(新位置和旧位置之间的差异),您需要做的就是将其标准化,并且您已经拥有旋转矩阵所需的内容。我会明确地写出计算,但是你的矩阵/矢量库很可能有一种方法来规范化矢量。

float vx = nexPosX - oldPosX;
float vy = newPosY - oldPosY;
float s = 1.0f / sqrt(vx * vx + vy * vy);
vx *= s;
vy *= s;

vx现在是旋转角度的余弦值,vy是旋转角度的正弦值。将其替换为旋转矩阵的标准形式,您得到:

R = ( cos(phi)  -sin(phi) ) = ( vx  -vy )
    ( sin(phi)   cos(phi) )   ( vy   vx )

这是新方向的绝对轮换。如果您需要旧方向和新方向之间的相对旋转,则只需要进行一些操作。假设您已经将旧方向和新方向的规范化向量计算为(v1x, v1y)(v2x, v2y)。旋转角的余弦是两个向量的标量积:

cosPhi = v1x * v2x + v1y * v2y;

正弦是交叉积的长度。由于两个向量都在xy平面中,这只是叉积的z分量:

sinPhi = v1x * v2y - v1y * v2x;

使用这两个值,您可以再次直接构建旋转矩阵:

R = ( cosPhi  -sinPhi )
    ( sinPhi   cosPhi )