首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Direct3D -如何从视图矩阵计算滚动?

Direct3D -如何从视图矩阵计算滚动?
EN

Stack Overflow用户
提问于 2010-03-07 19:31:56
回答 2查看 2.8K关注 0票数 4

这件事耗费了我整个晚上,我终于要举手寻求帮助了。基本上,在相机更新之后,从视图矩阵中计算俯仰和偏航是相当简单的:

代码语言:javascript
复制
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时,手动跟踪会崩溃。那么,谁有公式从视图矩阵中获得弧度(或度,我不关心)的滚动?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-07 20:08:54

看起来维基百科上关于Euler angles的文章包含了你在最后寻找的公式。

票数 0
EN

Stack Overflow用户

发布于 2010-03-08 03:42:09

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

代码语言:javascript
复制
fRoll  = atan2f( sCam.up.y, sCam.right.y ) - D3DX_PI/2;

正如Euler所指出的,你正在寻找Y(上)矩阵的Z值与X(右)矩阵的Z值的正切-尽管在这种情况下,我尝试了Z值,但它们没有产生预期的结果,所以我一时兴起尝试了Y值,得到了一个偏离+PI/2弧度(与所需值成直角)的值,这很容易补偿。最后,我有了一个陀螺精确和稳定的3D相机平台,具有自校正平衡功能。=)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2396087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档