C++ 需要澄清DX9中的注视矩阵计算
我将通过这两种方法来计算注视矩阵 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轴,眼睛)1C++ 需要澄清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
为什么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分量中的平移就足够了吗?