gpt4 book ai didi

opengl - 如何检测 View 矩阵是左手矩阵还是右手矩阵?

转载 作者:行者123 更新时间:2023-12-02 09:59:12 25 4
gpt4 key购买 nike

我有一个从 GL 程序收到的相机 View 矩阵。我知道这个矩阵是右手矩阵,因为这是 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),并且显然具有相同的符号。

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

最佳答案

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

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

<小时/>

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

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

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

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

关于opengl - 如何检测 View 矩阵是左手矩阵还是右手矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4464063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com