2

这是我经常在网上遇到的一个话题,但大多数网站在正确解释这一点方面做得很差。我目前正在创建自己的 Camera 类,作为从头构建的 3D 渲染器的一部分(如何更好地理解发生了什么,对吧?)。但是我在为相机创建 World 和 View 矩阵时遇到了麻烦。

据我了解,相机的世界矩阵本质上是将相机放置在世界空间中的位置的矩阵;仅当您需要在其位置并根据其方向渲染某些东西时,才需要这样做。另一方面,视图矩阵是将相机从该位置放置到世界空间原点的矩阵,沿 z 轴朝向一个方向或另一个方向(右手为负,左手为正,I相信)。到目前为止我是正确的吗?

给定一个位置定义为 m_Eye 的矩阵和一个定义为 m_LookAt 的外观,我如何生成世界矩阵?更重要的是,如何生成视图矩阵而不必执行昂贵的逆运算?我知道旋转元素的倒数等于它的转置,所以我认为这会影响它。无论如何,这是我一直在修改的代码。顺便说一句,我使用的是右手坐标系。

以下代码应生成适当的局部坐标轴:

m_W = AlgebraHelper::Normalize(m_Eye - m_LookAt);
m_U = AlgebraHelper::Normalize(m_Up.Cross(m_W));
m_V = m_W.Cross(m_U);

到目前为止,以下代码是我用来生成 World 矩阵的代码(注意,我也使用基于行的矩阵,因此 m_12 表示第一行和第二列):

Matrix4 matrix = Matrix4Identity;
matrix.m_11 = m_U.m_X;
matrix.m_12 = m_U.m_Y;
matrix.m_13 = m_U.m_Z;

matrix.m_21 = m_V.m_X;
matrix.m_22 = m_V.m_Y;
matrix.m_23 = m_V.m_Z;

matrix.m_31 = m_W.m_X;
matrix.m_32 = m_W.m_Y;
matrix.m_33 = m_W.m_Z;

matrix.m_41 = m_Eye.m_X;
matrix.m_42 = m_Eye.m_Y;
matrix.m_43 = m_Eye.m_Z;

这是计算 World 矩阵以及随后如何提取 View 矩阵的好方法吗?

预先感谢您对此事的任何帮助。

4

0 回答 0