0

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

GL_MODELVIEW 矩阵

(m3 = 0; m7 = 0; m11 = 0; m15 = 1)

我正在尝试将此数据加载到 ModelViewMatrix 中。我正在考虑这两种可能性:

  • 使用函数 glLoadTransposeMatrixf():

如果我使用此解决方案,我将获得正确的位置和方向。问题是我需要使用第二种解决方案,因为我正在修改代码上的 Left/Up/Forward/Translation 向量以修改视图。

  • 使用函数 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。这非常令人困惑……

4

1 回答 1

1

这两个选项之间存在差异。让我们称您的矩阵为 M。M 实际上做了什么?它不会世界空间转换到眼睛空间,而是正好相反。想想看。您假设您的相机位于“平移”点。让我们假设 M 的其余部分是恒等式,因此恰好位于相机位置的点应该被转换为原点。但它最终会在translation.xyz+translation.xyz,所以实际上,你的相机在点-translation.xyz。

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

于 2013-05-12T13:14:46.417 回答