目前我一直在计算视图矩阵:
viewMatrix = cameraRot * cameraTrans
和这样的模型矩阵:
modelMatrix = modelTrans * modelScale
其中cameraTrans和modelTrans是平移矩阵,modelScale是缩放矩阵,cameraRot和modelRot是四元数生成的旋转矩阵。
这是对的吗?我一直在谷歌搜索几个小时,没有人提到视图矩阵的顺序,只是模型矩阵。这一切似乎都有效,但我自己编写了矩阵和四元数实现,因此我无法确定这是否是一个错误。
(注意:矩阵是行专业)
答案 0 :(得分:2)
让我们谈谈坐标系之间的转换。假设您在本地系统上定义了一个点。您希望在全局系统中对其进行描述,因此您要做的是旋转此点,以便对齐其轴,然后将其转换为最终位置。您可以通过以下方式进行数学描述:
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
答案 1 :(得分:0)
你拥有的是正确的。
modelMatrix = modelTranslation * modelRotation * modelScale; // M=TRS
viewMatrix = cameraOrientation * cameraTranslation; // V=OT
为了使这更容易记住,首先要注意矩阵基本上是向后应用的。让我们考虑M=SRT
。所以你有一个立方体,你翻译它。但是如果旋转,它将从原始枢轴点旋转。然后,一旦应用缩放因子,模型将会倾斜,因为缩放在旋转后应用。这一切都很难处理 - 一旦你考虑到这一点,M=TRS
对于大多数目的来说要容易得多。这有点难以用文字描述,所以如果你想要一些图片,请告诉我。