如何检测视图矩阵是左撇子还是右撇子?

Asa*_*saf 5 opengl graphics matrix

我有一个从GL程序收到的相机视图矩阵。我知道这个矩阵是右撇子,因为这是GL的工作方式,但是我如何检查该矩阵是右撇子还是编程左撇子呢?

对于投影矩阵,我检查matrix [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);
Run Code Online (Sandbox Code Playgroud)

并且两个行列式相等(都等于0.99999994),并且显然具有相同的符号。

关于我的问题-由于我同时获得了视图矩阵和投影矩阵,并且测试投影矩阵是LH还是RH相对容易-我使用此信息来标识坐标系。

com*_*orm 4

您应该计算矩阵的行列式。在其他条件相同的情况下,左手矩阵和右手矩阵应该具有符号相反的行列式。

这有点奇怪,因为“左撇子”和“右手”几乎是任意的约定。但是,像镜子一样反映世界的矩阵具有负行列式,因此乘以这样的矩阵将改变行列式的符号。


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

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

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

因此,对你的问题的简短回答是“可能两者都不是”。

  • 创建一个已知的右手矩阵并将行列式与您的矩阵进行比较。如果它们不同,则您有一个左手矩阵。否则就是右手。 (2认同)