我正在使用OpenGl开发一个游戏项目。我正在建立一个我在网上找到的骨架代码游戏。我有一个可以在2D平面中移动的角色。 (x和z,即你正在从上面查看角色。)我目前仍然坚持让他在移动时旋转,而我似乎无法找到解决我问题的在线解决方案。
在角色被绘制的那一刻,他面向某种方式(沿着下图中的箭头)。我可以使用glm :: rotate。将其从默认方向旋转任意数度。
我已经更新了代码,以便在移动时记录一帧之前的字符位置,所以我有这些信息:
character old position (known)-> O
character starting angle (unknown)-> |\
| \
| \
|(X)\
| \
V O <- character new position (known)
如何计算角度(X)?是否有可能获得我的信息?
我一直在试图在最后一小时解决这个问题的页面上涂鸦,但似乎无法弄明白。非常感谢。
答案 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 )