视图矩阵应该按什么顺序计算?
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 也
目前我一直在这样计算视图矩阵:
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 也