gpt4 book ai didi

c++ - Direct3D - 如何从 View 矩阵计算滚动?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:06:10 25 4
gpt4 key购买 nike

这个问题耗费了我整个晚上的时间,我终于要举手寻求帮助了。基本上,在您进行相机更新后立即从 View 矩阵计算俯仰和偏航是相当简单的:

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 );

所以我的问题是:必须有一些方法可以获取以弧度为单位的 Roll,类似于在代码末尾获取 Pitch 和 Yaw 的方式。我已经尝试了几十种对我来说似乎有意义的算法,但没有一种给出了非常理想的结果。我意识到许多开发人员不跟踪这些值,但是我正在编写一些重新居中的例程并根据这些值设置裁剪,当您将混合旋转应用于 View 矩阵时,手动跟踪会失效。那么,有人知道从 View 矩阵中获取以弧度(或度数,我不在乎)为单位的滚动的公式吗?

最佳答案

哇哦,明白了!感谢 stacker 链接到维基百科上的欧拉角条目,最后的 Gamma 公式确实是正确的解决方案!因此,为了从“垂直平面”计算以弧度为单位的滚动,我使用了以下 C++ 代码行:

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

正如 Euler 指出的那样,您正在寻找 Y(上)矩阵的 Z 值与 X(右)矩阵的 Z 值的反正切值 - 虽然在这种情况下我尝试了 Z 值但它们没有产生想要的结果所以我随心所欲地尝试了 Y 值,我得到了一个偏离 +PI/2 弧度(与想要的值成直角)的值,这很容易补偿。最后,我有了一个具有自校正平衡的重力精确稳定的 3D 相机平台。 =)

关于c++ - Direct3D - 如何从 View 矩阵计算滚动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2396087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com