这件事耗费了我整个晚上,我终于要举手寻求帮助了。基本上,在相机更新之后,从视图矩阵中计算俯仰和偏航是相当简单的:
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 );所以我的问题是:必须有某种方法来获得以弧度表示的滚动,就像在代码末尾获得俯仰和偏航一样。我尝试了几十种对我来说似乎有意义的算法,但没有一种算法能给出理想的结果。我意识到许多开发人员不会跟踪这些值,但是我正在编写一些重新居中的例程,并根据这些值设置裁剪,当您将混合旋转应用到View Matrix时,手动跟踪会崩溃。那么,谁有公式从视图矩阵中获得弧度(或度,我不关心)的滚动?
发布于 2010-03-07 20:08:54
看起来维基百科上关于Euler angles的文章包含了你在最后寻找的公式。
发布于 2010-03-08 03:42:09
哇哦,拿到了!感谢stacker在维基百科上链接到Euler Angles条目,最后的gamma公式确实是正确的解决方案!因此,为了从“垂直平面”计算以弧度为单位的滚动,我使用了下面这行C++代码:
fRoll = atan2f( sCam.up.y, sCam.right.y ) - D3DX_PI/2;正如Euler所指出的,你正在寻找Y(上)矩阵的Z值与X(右)矩阵的Z值的正切-尽管在这种情况下,我尝试了Z值,但它们没有产生预期的结果,所以我一时兴起尝试了Y值,得到了一个偏离+PI/2弧度(与所需值成直角)的值,这很容易补偿。最后,我有了一个陀螺精确和稳定的3D相机平台,具有自校正平衡功能。=)
https://stackoverflow.com/questions/2396087
复制相似问题