Direct3D - 如何从视图矩阵计算Roll?

4
这个问题困扰我一整晚,最终放弃了,希望能得到一些帮助。基本上,在相机更新后,从视图矩阵中计算俯仰角和偏航角非常简单:
D3DXMatrixLookAtLH(&m_View, &sCam.pos, &vLookAt, &sCam.up);
pDev->SetTransform(D3DTS_VIEW, &m_View);

// Set the camera axes from the view matrix
sCam.right.x = m_View._11;
sCam.right.y = m_View._21;
sCam.right.z = m_View._31;
sCam.up.x    = m_View._12;
sCam.up.y    = m_View._22;
sCam.up.z    = m_View._32;
sCam.look.x  = m_View._13;
sCam.look.y  = m_View._23;
sCam.look.z  = m_View._33;

// Calculate yaw and pitch and roll
float lookLengthOnXZ = sqrtf( sCam.look.z^2 + sCam.look.x^2 );
fPitch = atan2f( sCam.look.y, lookLengthOnXZ );
fYaw   = atan2f( sCam.look.x, sCam.look.z );

所以我的问题是:必须有一种类似于代码末尾获取俯仰角和偏航角的方式来获取弧度值。我已经尝试了几十种看起来很有道理的算法,但没有一个能得到期望的结果。我意识到许多开发人员不跟踪这些值,但我正在编写一些重新居中的例程,并基于这些值设置剪裁,手动跟踪在将混合旋转应用于视图矩阵时会失效。那么,有没有人知道从视图矩阵中获取滚动角的公式(或度数,我不在乎)?
2个回答

3

太好了,我搞定了!感谢 stacker 给我提供了维基百科欧拉角条目的链接,最后的伽马公式确实是正确的解决方案!因此,要从“垂直平面”计算弧度中的 Roll,我正在使用以下行的 C++ 代码:

fRoll  = atan2f( sCam.up.y, sCam.right.y ) - D3DX_PI/2;

正如欧拉所指出的那样,您需要查找Y(上)矩阵的Z值相对于X(右)矩阵的Z值的反正切 - 尽管在这种情况下,我尝试了Z值,但它们没有产生所需的结果,因此我随意尝试了Y值,得到了一个值,该值偏离了+PI/2弧度(与所需值成直角),但这很容易补偿。最终,我拥有了一个陀螺仪精确且稳定的三维摄像机平台,具有自校准平衡。=)

0

看起来维基百科关于 欧拉角 的文章在结尾处包含了你正在寻找的公式。


事后看来,我的解释完全是废话,因为我完全忘记了您需要根据前向量将默认上向量向下倾斜。 - Goz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接