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

时间:2010-12-16 18:20:21

标签: opengl graphics matrix

我有一个从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 - 我使用这些信息来识别坐标系。

2 个答案:

答案 0 :(得分:2)

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

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


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

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

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

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

答案 1 :(得分:0)

刚刚绑定了同样的任务(仅用于检测镜像转换的对象),找到了一个简单的解决方案,共享它。如果矩阵具有包含3个垂直轴的3x3部分,那么您可以只生成轴1和1的交叉乘积。 2,然后做这个结果和剩余的第3轴的标量积。检查它是否为负数 - 您可以决定是否镜像右/左手/物体。如果我理解正确的问题......