我已经定义了一个包含相机位置和方向的矩阵,类似于GL_MODELVIEW矩阵:
(m3 = 0; m7 = 0; m11 = 0; m15 = 1)
我正在尝试将此数据加载到ModelViewMatrix中。我正在考虑这两个可能性:
使用glLoadTransposeMatrixf()函数:
如果我使用此解决方案,我将获得正确的位置和方向。问题是我需要使用第二种解决方案,因为我正在修改我的代码上的左/上/前/下转换向量以修改视图。
使用函数gluLookAt():
gluLookAt(Translation->X,
Translation->Y,
Translation->Z,
Translation->X-Forward->X,
Translation->Y-Forward->Y,
Translation->Z-Forward->Z,
Up->X,
Up->Y,
Up->Z);
我的问题是我用它获得的GL_MODELVIEW矩阵与其他情况不同。具体来说,翻译矢量是错误的,但左/上/前向矢量是正确的。
我真的很困惑。有人可以解释这两个选项之间是否存在差异以及我做错了什么?,
修改
获得的结果:
我正在使用像这样的矩阵M:
M = (Lx Upx Fwx tx)
(Ly Upy Fwy ty)
(LZ Upz Fwz tz)
(0 0 0 1 )
使用第一种方法,我将获得正确的GL_MODELVIEW矩阵:
N = (Lx Upx Fwx tx)
(Ly Upy Fwy ty)
(Lz Upz Fwz tz)
(0 0 0 1 )
但是第二种方法我正在获取下一个GL_MODELVIEW矩阵:
N = (Lx Upx Fwx tx')
(Ly Upy Fwy ty')
(Lz Upz Fwz tz')
(0 0 0 1 )
请注意,tx'!= tx,ty'!= ty,tz'!= tz。这非常令人困惑......
答案 0 :(得分:1)
这两个选项之间存在差异。让我们称你的矩阵M. M实际上做了什么?它确实不从世界空间转换到眼睛空间,但完全相反。想一想。您认为您的相机处于“翻译”点。让我们假设M的其余部分是同一性,因此恰好在摄像机位置的一个点应该被转换为原点。但它最终将转换为translation.xyz + translation.xyz,所以实际上,你的相机位于-translation.xyz点。
如果您的第一种方法实际上给出了“正确”的结果,那么您似乎还有其他错误。