我目前正在与C#合作一个游戏项目,我正在研究如何在3D空间中移动相机。我有一个4x4的全球世界矩阵。我知道这个矩阵处理物体在空间中的平移和旋转。我现在知道第三行处理对象的位置,所以我可以沿着xyz平面移动相机。然而,我想要执行沿局部轴和全局轴旋转相机。参考this post,我有一个如何旋转相机的想法。然而,我希望对矩阵有更清楚的了解,以及就平移和旋转而言,不同的行和列代表什么。我还想知道4x4矩阵是否包含有关相机的局部和全局位置的信息。这意味着我可以操纵矩阵来围绕外部轴或点旋转相机吗?给出这个矩阵,我可以对相机做多少操作?
发布于 2014-09-19 05:54:07
在回答真实的(1)问题时,3D数学比你想象的要复杂得多。
现在忽略四元数,矩阵可以被认为是:
Rx Ry Rz 0
Ux Uy Uz 0
Ax Ay Az 0
Px Py Pz 1或者它可能是上述内容的转置,这取决于您如何设置系统,但最终它确实没有什么区别,并且在很大程度上取决于您的硬件。R是右轴,U是上方轴,A是At轴,P是位置。表示每个向量的分量的x、y和z后缀。这很容易可视化:想一想一组正交的单位向量,前三个定义旋转,最后一个是矩阵在世界上的位置,这就是上面的矩阵。
一旦你了解了上面的内容,移动它应该是相当容易的。然而,旋转它要复杂得多。看东西很简单:
A = |target pos - camera pos| (pos is bottom row here)然后R和U是A和指向正确方向的全局轴的叉积。
矩阵可以绕任意轴旋转(您提到的局部轴和全局轴都在其中),但数学非常复杂(对于这个答案来说太复杂了)。
这个站点更详细:Wikipedia这里列出了一些标准的矩阵运算。你也可以访问Wolfram网站进行更深入的讨论,如果你去看看,那里肯定有很好的在线资源。
矩阵可以相乘,结果是每个矩阵单独执行的操作的有效组合。因此,你可以有一个矩阵作为一般的运动(单位,轴对齐的方向部分向量),另一个矩阵可以是(0,0,0)处的旋转矩阵。这两个矩阵的乘积就是运动和旋转矩阵。这就是世界上对象层次结构和对象放置的工作方式。此外,它也被用于动画中。
您正在使用的API应该提供一个绕任意轴旋转矩阵的API,但这对于了解发生了什么很有用。
一旦你想通了所有这些,你就可以看看四元数了。只需记住,对于四元数,没有什么是不能用矩阵来做的。
(1)据我所知
发布于 2014-09-19 00:42:06
在3d图形中,旋转是由四元数而不是矩阵表示的。有一组函数可以操作四元数。
你可以用四元数来perform rotation along any axis你想要的。您可以很容易地组合甚至(这几乎不可能是矩阵)对四元数进行插值。
四元数可以转换为矩阵,这是产生任何旋转矩阵的方式。如果要将旋转应用于对象或将旋转与其他变换(如平移或缩放)组合,则应首先将四元数转换为矩阵。
无论你实际使用的是哪种DirectX,APIs都是一个关于矩阵和四元数信息的很好的来源--在所有3DAPI中数学是统一的。
关于矩阵行/列含义的问题:矩阵可以表示相当复杂的变换,包括跨对象的几何中心以外的点进行缩放或旋转。所以你不应该以这种方式考虑矩阵,你应该把一个复杂的矩阵想象成简单矩阵的乘法。
https://stackoverflow.com/questions/25917020
复制相似问题