Opengl 视图矩阵应按什么顺序计算?

Opengl 视图矩阵应按什么顺序计算?,opengl,matrix,3d,language-agnostic,Opengl,Matrix,3d,Language Agnostic,目前我一直在计算视图矩阵,如下所示: viewMatrix = cameraRot * cameraTrans modelMatrix = modelTrans * modelScale 模型矩阵如下所示: viewMatrix = cameraRot * cameraTrans modelMatrix = modelTrans * modelScale 其中cameraTrans和modelTrans是平移矩阵,modelScale是缩放矩阵,cameraRot和modelRot是由四

目前我一直在计算视图矩阵,如下所示:

viewMatrix = cameraRot * cameraTrans
modelMatrix = modelTrans * modelScale
模型矩阵如下所示:

viewMatrix = cameraRot * cameraTrans
modelMatrix = modelTrans * modelScale
其中cameraTrans和modelTrans是平移矩阵,modelScale是缩放矩阵,cameraRot和modelRot是由四元数生成的旋转矩阵

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


(注意:矩阵是行主键)

您所拥有的是正确的

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

为了便于记忆,首先要注意矩阵基本上是向后应用的。让我们考虑<代码> m=SRT < /代码>。所以你有一个立方体,然后你翻译它。但如果旋转,它将从原始轴心点旋转。然后,应用缩放因子后,模型将发生倾斜,因为旋转后将应用缩放。这很难处理->代码> M= Trs<代码>对于大多数目的来说,一旦考虑到这一点就容易多了。这有点难以用语言描述,所以如果您想要一些图片,请告诉我。

让我们谈谈坐标系之间的转换。假设您在本地系统上定义了一个点。您希望在全局系统中描述它,所以您要做的是旋转该点,以对齐其轴,然后将其平移到其最终位置。可以通过以下数学方法来描述这一点:

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

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

这个问题没有单一的答案,因为它取决于你想要实现什么。对于第一人称相机来说,这看起来是正确的,对于围绕原点旋转的相机来说不是。@BDL第一人称相机是我想要的。忘了提那件事了。谢谢