从ModelViewMatrix获取角度

时间:2013-07-19 15:50:29

标签: c++ opengl

我在游戏中有以下矩阵我正在进行逆向工程以了解它是如何工作的。

我设法在渲染模型时捕获此矩阵:

     0.999971,     0.003148,     -0.006994,  0.000000
     0.000000,     0.911863,      0.410494,  0.000000
     0.006903,    -0.410485,      0.911844,  0.000000
-25014.388672, 11944.956055, -19475.357422,  1.000000

我开始使用以下方法计算角度:

Point CalculateRotatation(float ModelView[16])
{
    Point Result;
    Result.X = atan2(ModelView[9], ModelView[10]) * (180 / PI);
    Result.Y = atan2(-ModelView[8], ModelView[9]) * (180 / PI);
    Result.Z = atan2(ModelView[4], ModelView[0]) * (180 / PI);
    return Result;
}

我关注的是:http://db-in.com/blog/2011/04/cameras-on-opengl-es-2-x/

我不确定我是否正确地做到了。游戏不使用OpenGL-ES,但我不确定它是否重要。

你们有没有人告诉我,如果我走在正确的道路上,或者我的计算功能是否正确? Y值似乎是错误的。我知道有很多这样的线索,我看了看他们,但他们似乎没有做我所拥有的。他们使用点积和交叉产品。我只需要确认或一点帮助。

编辑:我非常了解:

我知道X和Y旋转的计算是正确的。如果我从左到右改变角色的视图,Z增加/减少。如果我改变角色的视野高度,则X增加/减少。然而,我不知道它是对的还是如何得到它...我有这个图: enter image description here

1 个答案:

答案 0 :(得分:3)

从旋转矩阵中提取固定角度可以有多个答案,因为它涉及反三角函数和平方根。例如,如果旋转序列是x-y-z(带行向量系统),则公式如下所示。

AngleX = atan2(m11, m22)
AngleY = atan2(-m02, sqrt(m00^2 + m01^2))
AngleZ = atan2(m01, m00)

但是,这不是故事的结尾。我确信this article会帮助您找到更好的方法。祝你好运!