C++ 需要澄清DX9中的注视矩阵计算

C++ 需要澄清DX9中的注视矩阵计算,c++,directx,directx-9,C++,Directx,Directx 9,我将通过这两种方法来计算注视矩阵 zaxis=正常(眼睛处) xaxis=正常(交叉(向上,zaxis)) yaxis=交叉(zaxis,xaxis) xaxis.xyaxis.xzaxis.x0 xaxis.y yaxis.y zaxis.y 0 xaxis.zyaxis.zzaxis.z0 -点(X轴,眼睛)-点(Y轴,眼睛)-点(Z轴,眼睛)1 zaxis=正常(眼睛-At) xaxis=正常(交叉(向上,zaxis)) yaxis=交叉(zaxis,xaxis) xaxis.xyax

我将通过这两种方法来计算注视矩阵

  • zaxis=正常(眼睛处)

    xaxis=正常(交叉(向上,zaxis))

    yaxis=交叉(zaxis,xaxis)

    xaxis.xyaxis.xzaxis.x0

    xaxis.y yaxis.y zaxis.y 0

    xaxis.zyaxis.zzaxis.z0

    -点(X轴,眼睛)-点(Y轴,眼睛)-点(Z轴,眼睛)1

  • zaxis=正常(眼睛-At)

    xaxis=正常(交叉(向上,zaxis))

    yaxis=交叉(zaxis,xaxis)

    xaxis.xyaxis.xzaxis.x0

    xaxis.y yaxis.y zaxis.y 0

    xaxis.zyaxis.zzaxis.z0

    点(X轴,眼睛)点(Y轴,眼睛)点(Z轴,眼睛)1


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

    TL;DR:D3DXMatrixLookAtRH的Microsoft文档页面错误。我已经提交了一份文件来修复它

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

    唯一的区别是zaxis计算

    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;
    }
    
    D3DXMatrixLookAtRH
    D3DXMatrixLookAtLH
    都是“D3DXMath”的一部分,该数学库包含在D3DX9和D3DX10中。这些帮助程序库和DirectX SDK本身都不推荐使用。建议改为使用

    如果出于某种原因必须使用D3DX9,请注意,只需使用NuGet即可避免混合使用传统DirectX SDK和现代版本的Visual Studio时遇到的所有复杂问题。新项目应转移到任何一个项目。有关更多详细信息,请参阅


    右侧版本对zdir使用
    At-Eye
    而不是
    At-Eye
    ,dot产品为正确放置位置而被否定。左视图坐标和右视图坐标之间的唯一区别是z轴方向。请注意,D3DX9与传统Direct3D 9一样不推荐使用。对于新项目,您应该查看哪些是内联代码,而不是隐藏在DLL中。在这里,你会看到RH所做的就是对视图向量求反,然后调用LH函数。如果问题只是对Z轴求反,为什么所有坐标都要在平移中反转?仅仅反转Z分量中的平移就足够了吗?