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

What order should the view matrix be caluculated in?

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

viewMatrix = cameraRot * cameraTrans

模型矩阵如下:

modelMatrix = modelTrans * modelScale

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

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

(注:矩阵是行主)

你得到的是正确的。

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

请注意,某些系统(glm library, for example), define this matrix (X) as lookAt and its definition can be found here. I would suggest you to here this article