这是我经常在网上遇到的一个话题,但大多数网站都做得不好,正确解释了这一点。我目前正在创建自己的Camera类作为从头开始构建的3D渲染器的一部分(如何更好地理解发生了什么,对吧?)。但是我为相机创建了World和View矩阵时遇到了麻烦。
据我所知,相机的世界矩阵基本上是将相机置于世界空间所需的矩阵;只有当你需要根据其方向渲染某些东西时才需要它。视图矩阵,在另一方面,是从该位置到世界空间的原点放置相机,沿着z轴在一个方向或另一个方向(负用于右手的,正面为左手面向矩阵,我相信)。到目前为止我是否正确?
给定一个矩阵,其位置定义为m_Eye,一个lookat定义为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);
下面的代码是我,到目前为止,用于生成世界矩阵(注意,我还与基于行的矩阵工作,所以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矩阵?
提前感谢您对此事的任何帮助。