【问题标题】:Camera lookAt target changes when rotating parent node旋转父节点时相机lookAt目标发生变化
【发布时间】:2012-11-02 19:14:46
【问题描述】:

我有以下问题。我有一个带有 lookAt 方法的相机,它工作正常。我有一个父节点,我将相机作为父节点。如果我在旋转父节点的同时保持相机 lookAt 目标,相机 lookAt 会发生变化太。这也不是我想要实现的。当您将相机作为空对象的父相机时,我需要它像在 Adob​​e AE 中一样工作:当空对象旋转时,相机开始围绕目标旋转,同时仍然看着目标。我是什么目前做的是将父模型矩阵与从lookAt()方法计算的相机模型矩阵相乘。我确定我需要在将它们相乘之前分解(或重构)其中一个矩阵。父模型或相机模型?这里的任何人都可以展示正确的做法吗?

更新:父节点只是一个节点。子节点是相机。AfterEffects 中的父相机的工作方式如下:如果在相机看着目标时旋转父节点,相机实际上开始围绕目标围绕目标旋转父旋转。在我的情况下,父旋转也会改变相机的外观方向,这不是我想要的。希望现在很清楚。 更新1: 我使用 GL 4.0 ,没有固定的管道,我所有的数学都是手动完成的。

【问题讨论】:

    标签: math opengl camera rotation


    【解决方案1】:

    OpenGL 不是场景图;没有对象,没有相机! gluLookAt 甚至不是 OpenGL,它只是一个辅助函数,它不知道应用了任何转换层次结构。由于 OpenGL 不处理场景和 glPushMatrix,glPopMatrix 给人一种更大的错误感觉,你可能被引诱以错误的方式思考它。

    有责任完成您期望的所有数学运算。这就是你要做的:

    1. 您不应再使用 OpenGL 固定函数矩阵操作方法。它们已被弃用,并已从更高版本的 OpenGL 中删除!

    2. 实现功能齐全的场景图。为此使用功能完整的矩阵数学库。最重要的是,您需要一种方法来确定转换层次结构树中任意两个节点之间的转换(矩阵)。最直接的方法是从起始节点和目标节点开始进行右关联乘法,同时遍历到顶部,直到到达共享祖先节点。然后将反转的目标节点变换组合与起始节点的变换组合相乘。结果就是它们之间的转换。

    现在您可以确定节点之间的转换,您就拥有了在该转换定义的空间内正确查看操作的工具。

    【讨论】:

    • 好吧好吧,我的错,还没有提到。我知道,并且我手动进行所有数学运算。使用 GL 4.0,没有固定的东西 :) 你可能错过了我的问题的重点。我有一个完美的常规节点(父到子等)的场景图系统。但是对于相机育儿场景我需要它的工作方式略有不同。所以父旋转不应该旋转相机节点,而是围绕目标旋转它。这就是它在 AfterEffects 中的工作方式。
    • 其实没用过固定管道:P
    【解决方案2】:

    实际的问题是视图和模型矩阵的状态。在其位置向量已经被否定后,我错误地反转了视图矩阵。所以正确的做法是将父节点模型矩阵与相机视图矩阵相乘,这样就解决了问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 2014-07-30
      • 2012-12-25
      • 2014-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多