【问题标题】:What order should the view matrix be caluculated in?应该以什么顺序计算视图矩阵?
【发布时间】:2016-06-29 13:33:06
【问题描述】:

目前我一直在计算这样的视图矩阵:

viewMatrix = cameraRot * cameraTrans

和这样的模型矩阵:

modelMatrix = modelTrans * modelScale

其中cameraTrans和modelTrans是平移矩阵,modelScale是缩放矩阵,cameraRot和modelRot是四元数产生的旋转矩阵。

这是正确的吗?我已经在谷歌上搜索了几个小时,没有人提到视图矩阵的顺序,只是模型矩阵。这一切似乎都有效,但我自己编写了矩阵和四元数实现,所以我无法判断这是否是一个错误。

(注意:矩阵是行主要的)

【问题讨论】:

  • 这个问题没有单一的答案,因为这取决于您想要达到的目标。对于第一人称相机来说,这看起来是正确的,但对于围绕原点的轨道相机来说则不然。
  • @BDL 第一人称相机是我想要的。忘了提那个。谢谢。

标签: opengl matrix 3d language-agnostic


【解决方案1】:

让我们谈谈坐标系之间的转换。假设您在本地系统上定义了一个点。你想在一个全局系统中描述它,所以你要做的就是旋转这个点,以便对齐它的轴,然后,把它翻译到它的最终位置。您可以通过以下数学方式对此进行描述:

Pg = T*R*Pl, where M = T*R

通过这种方式,M 允许您将在局部坐标系中定义的任何点描述到全局坐标系中。

你可以用相机做同样的事情,但你真正想要的是做你之前做的完全相反的事情,即你想将全局坐标系中的任何点描述为相机局部坐标系:

Pc = X*Pg, but what is the value of X?

你知道的:

Pg = Tc*Rc*Pc, so Pc = inv(Tc*RC)*Pg

按顺序:

X = inv(Tc*Rc) = inv(Rc) * inv(Tc)

因此,要描述一个点,从其局部坐标系到相机坐标系,您只需连接这两个矩阵:

Pc = inv(Rc)*inv(Tc)*T*R*P, where
M' = inv(Rc)*inv(Tc)*T*R

请注意,某些系统(例如glm library)将此矩阵(X)定义为lookAt,其定义可在here 中找到。我建议你也来这里article

【讨论】:

    【解决方案2】:

    你所拥有的是正确的。

    modelMatrix = modelTranslation * modelRotation * modelScale; // M=TRS
    viewMatrix = cameraOrientation * cameraTranslation; // V=OT
    

    为了使这更容易记住,首先请注意矩阵本质上是向后应用的。让我们考虑M=SRT。所以你有一个立方体,你翻译它。但是,如果您旋转,它将从原始枢轴点旋转。然后,一旦应用了缩放因子,模型就会倾斜,因为缩放是在旋转之后应用的。这一切都很难处理——一旦你考虑到这一点,M=TRS 对于大多数用途来说会容易得多。这有点难以用语言描述,所以如果你想要一些图片,请告诉我。

    【讨论】:

      猜你喜欢
      • 2015-04-15
      • 1970-01-01
      • 2020-02-12
      • 2021-03-04
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 2019-11-06
      • 2023-03-31
      相关资源
      最近更新 更多