【问题标题】:Loading ModelViewMatrix using glulookat使用 glulookat 加载 ModelViewMatrix
【发布时间】:2021-09-29 21:03:06
【问题描述】:

我已经定义了一个矩阵,其中包含类似于 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 矩阵与其他情况不同。具体来说,Translation 向量是错误的,但 Left/Up/Forward 向量是正确的。

我真的很困惑。有人可以解释一下这两个选项之间是否存在差异以及我做错了什么吗?

获得的结果:

我正在使用这样的矩阵 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。这很令人困惑...

【问题讨论】:

    标签: opengl glulookat


    【解决方案1】:

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

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

    【讨论】:

    • 所以你是说我应该在我的 gluLookAtFunction 上使用 -Translation 而不是 Translation,对吧?无论如何,我没有得到预期的结果,所以还有其他问题。
    • @Escucum:我想说的远不止这些。您不会以这种方式获得预期的结果,因为您的矩阵 M 仍然是 gluLookAt 的倒数。如果您执行 gluLookAt(Transpose, Transpose + Forward, Up); ,您可以使用lookAt 获得与 M^-1 相同的结果;如果你想准确地得到你的矩阵,你不仅要否定 Translate,还要指定完全不同的向量。
    • 好的,现在我知道了。但是我已经在 gluLookAt 解决方案中使用了正确的 M 转置矩阵。我已经编辑了这个问题,包括一个具体示例,其中包含两种可能的结果,以澄清我的问题。
    • @Escucum: 好吧,如果你的上 3x3 子矩阵是正交基(在这种情况下这可能不是不可能的),它的转置将是它的逆。但这不考虑翻译部分。基本上,您有旋转 R 和平移 T。您的 M = T*R,但 M^-1=R^-1*T^-1 (注意交换顺序),这解释了平移部分的差异,以及无法通过简单的转置来修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多