opengl – 如何检测视图矩阵是左手还是右手?

我有一个从GL程序收到的摄像机视图矩阵.我知道这个矩阵是右手的,因为这是GL工作的方式,但是如何检查这个矩阵是右手还是左手编程?

对于投影矩阵,我检查矩阵[3] [4](行主要)是否为正,看它是否是左手.它是否正确?

谢谢.

编辑:

我尝试了决定性解决方案,但遗憾的是它不是真的(至少根据我的实验):

我已经使用DX9数学函数来测试它(以避免我的代码中的任何可能的错误).
我运行了以下代码:

 D3DXVECTOR3 vEye(0,0,0);
 D3DXVECTOR3 vTarget(6,3,0);
 D3DXVECTOR3 vUp(0,0,1);

 D3DXMATRIX matViewLH;
 D3DXMATRIX matViewRH;

 D3DXMatrixLookAtLH(&matViewLH, &vEye, &vTarget, &vUp);
 D3DXMatrixLookAtRH(&matViewRH, &vEye, &vTarget, &vUp);

 float fLHDet = D3DXMatrixDeterminant(&matViewLH);
 float fRHDet = D3DXMatrixDeterminant(&matViewRH);

并且两个决定因素是相等的(均等于0.99999994),并且显然具有相同的符号.

至于我的问题 – 因为我得到了视图矩阵和投影矩阵,并且我相对容易测试投影矩阵是LH还是RH – 我使用这些信息来识别坐标系.

最佳答案 你应该采用矩阵的行列式.在其他条件相同的情况下,左撇子和右撇子矩阵应该有相反符号的决定因素.

这有点奇怪,因为“左撇子”和“右撇子”几乎都是随意的惯例.但是,像镜子一样反映世界的矩阵具有负面决定因素,因此乘以这样的矩阵将改变行列式的符号.

编辑(参考更新的OQ):我怀疑D3DX * LH()和D3DX * RH()函数之间的区别在于它们支持2种不同的约定.

如果是这样,你应该意识到“左撇子”和“右撇子”不是每个单独矩阵的属性,而是这些函数集生成的矩阵如何组合在一起.如果您坚持使用* LH()函数,一切都应该正常运行;类似于* RH()函数 – 但如果你混合它们,你可能会得到意想不到的结果.

在任何情况下,这些约定都不与GL有关,GL有自己的约定,与D3D的任何一个都不完全兼容.例如,GL的Z裁剪惯例与D3D不同;这意味着生成相同视图的投影矩阵在系统之间必然不同.

所以,对你的问题的简短回答是“可能都没有”.

点赞