我要用这两种方法来计算查找矩阵
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
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?
发布于 2021-05-20 07:20:14
TL;DR: Microsoft页面用于D3DXMatrixLookAtRH是错误的。我已经提交了一个按下来修复它。
在D3DXMath的实际实现中,很明显,在这两种情况下,LH和RH的翻译都应该是-dot(xaxis, eye) -dot(yaxis, eye) -dot(zaxis, eye)。
唯一的区别是z轴的计算。
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本身一样,这些助手库也被废弃了。建议使用DirectXMath代替。如果出于某种原因必须使用D3DX9,请注意,只需使用Microsoft.DXSDK.D3DX NuGet就可以避免Microsoft中涉及的所有复杂问题--混合传统的DirectX SDK和Visual的现代版本。新项目应该转移到任何一个各种替代物中。有关更多详细信息,请参阅这篇博客文章。
https://stackoverflow.com/questions/67614091
复制相似问题