首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LookAt矩阵计算在DX9中的应用

LookAt矩阵计算在DX9中的应用
EN

Stack Overflow用户
提问于 2021-05-20 04:38:10
回答 1查看 86关注 0票数 0

我要用这两种方法来计算查找矩阵

  1. D3DXMatrixLookAtLH

Z轴=正常(眼)

X轴=法向(交叉(向上,z轴))

Y轴=交叉(z轴,x轴)

Xaxis.xyaxis.xzaxis.x0

xaxis.y yaxis.y zaxis.y 0

xaxis.z yaxis.z zaxis.z 0

-dot(眼轴)-dot(眼轴)-dot(眼轴)1

  1. D3DXMatrixLookAtRH

Z轴=正常(眼- At)

X轴=法向(交叉(向上,z轴))

Y轴=交叉(z轴,x轴)

Xaxis.xyaxis.xzaxis.x0

xaxis.y yaxis.y zaxis.y 0

xaxis.z yaxis.z zaxis.z 0

点(x轴,眼)点(y轴,眼)点(z轴,眼)1

为什么RH的翻译不乘以-1?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-20 07:20:14

TL;DR: Microsoft页面用于D3DXMatrixLookAtRH是错误的。我已经提交了一个按下来修复它。

在D3DXMath的实际实现中,很明显,在这两种情况下,LH和RH的翻译都应该是-dot(xaxis, eye) -dot(yaxis, eye) -dot(zaxis, eye)

唯一的区别是z轴的计算。

代码语言:javascript
复制
D3DXMATRIX* WINAPI D3DXMatrixLookAtRH
    ( D3DXMATRIX *pOut, const D3DXVECTOR3 *pEye, const D3DXVECTOR3 *pAt,
      const D3DXVECTOR3 *pUp )
{
    D3DXVECTOR3 XAxis, YAxis, ZAxis;

    // Compute direction of gaze. (-Z)
    D3DXVec3Subtract(&ZAxis, pEye, pAt);
    D3DXVec3Normalize(&ZAxis, &ZAxis);

    // Compute orthogonal axes from cross product of gaze and pUp vector.
    D3DXVec3Cross(&XAxis, pUp, &ZAxis);
    D3DXVec3Normalize(&XAxis, &XAxis);
    D3DXVec3Cross(&YAxis, &ZAxis, &XAxis);

    // Set rotation and translate by pEye
    pOut->_11 = XAxis.x;
    pOut->_21 = XAxis.y;
    pOut->_31 = XAxis.z;
    pOut->_41 = -D3DXVec3Dot(&XAxis, pEye);

    pOut->_12 = YAxis.x;
    pOut->_22 = YAxis.y;
    pOut->_32 = YAxis.z;
    pOut->_42 = -D3DXVec3Dot(&YAxis, pEye);

    pOut->_13 = ZAxis.x;
    pOut->_23 = ZAxis.y;
    pOut->_33 = ZAxis.z;
    pOut->_43 = -D3DXVec3Dot(&ZAxis, pEye);

    pOut->_14 = 0.0f;
    pOut->_24 = 0.0f;
    pOut->_34 = 0.0f;
    pOut->_44 = 1.0f;


    return pOut;
}

D3DXMATRIX* WINAPI D3DXMatrixLookAtLH
    ( D3DXMATRIX *pOut, const D3DXVECTOR3 *pEye, const D3DXVECTOR3 *pAt,
      const D3DXVECTOR3 *pUp )
{
    D3DXVECTOR3 XAxis, YAxis, ZAxis;

    // Compute direction of gaze. (+Z)
    D3DXVec3Subtract(&ZAxis, pAt, pEye);
    D3DXVec3Normalize(&ZAxis, &ZAxis);

    // Compute orthogonal axes from cross product of gaze and pUp vector.
    D3DXVec3Cross(&XAxis, pUp, &ZAxis);
    D3DXVec3Normalize(&XAxis, &XAxis);
    D3DXVec3Cross(&YAxis, &ZAxis, &XAxis);

    // Set rotation and translate by pEye
    pOut->_11 = XAxis.x;
    pOut->_21 = XAxis.y;
    pOut->_31 = XAxis.z;
    pOut->_41 = -D3DXVec3Dot(&XAxis, pEye);

    pOut->_12 = YAxis.x;
    pOut->_22 = YAxis.y;
    pOut->_32 = YAxis.z;
    pOut->_42 = -D3DXVec3Dot(&YAxis, pEye);

    pOut->_13 = ZAxis.x;
    pOut->_23 = ZAxis.y;
    pOut->_33 = ZAxis.z;
    pOut->_43 = -D3DXVec3Dot(&ZAxis, pEye);

    pOut->_14 = 0.0f;
    pOut->_24 = 0.0f;
    pOut->_34 = 0.0f;
    pOut->_44 = 1.0f;

    return pOut;
}

D3DXMatrixLookAtRHD3DXMatrixLookAtLH都是"D3DXMath“的一部分,这是D3DX9 D3DX10中包含的数学库。与DirectX SDK本身一样,这些助手库也被废弃了。建议使用DirectXMath代替。如果出于某种原因必须使用D3DX9,请注意,只需使用Microsoft.DXSDK.D3DX NuGet就可以避免Microsoft中涉及的所有复杂问题--混合传统的DirectX SDK和Visual的现代版本。新项目应该转移到任何一个各种替代物中。有关更多详细信息,请参阅这篇博客文章

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

https://stackoverflow.com/questions/67614091

复制
相关文章

相似问题

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