使用glulookat加载ModelViewMatrix

时间:2013-05-12 11:21:45

标签: opengl glulookat viewing

我已经定义了一个包含相机位置和方向的矩阵,类似于GL_MODELVIEW矩阵:

GL_MODELVIEW matrix

(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。这非常令人困惑......

1 个答案:

答案 0 :(得分:1)

这两个选项之间存在差异。让我们称你的矩阵M. M实际上做了什么?它确实从世界空间转换到眼睛空间,但完全相反。想一想。您认为您的相机处于“翻译”点。让我们假设M的其余部分是同一性,因此恰好在摄像机位置的一个点应该被转换为原点。但它最终将转换为translation.xyz + translation.xyz,所以实际上,你的相机位于-translation.xyz点。

如果您的第一种方法实际上给出了“正确”的结果,那么您似乎还有其他错误。