我目前正在使用C#进行游戏项目,我正致力于在3D空间中移动相机。我有一个4x4全球世界矩阵。我理解这个矩阵处理对象在空间中的平移和旋转。我目前知道第3行处理对象的位置,所以我可以沿着xyz平面移动相机。但是我想沿着局部轴和全局轴执行旋转相机。参考this帖子我知道如何旋转相机。然而,我想更清楚地了解矩阵以及各种行和列在转换和旋转方面所代表的含义。我还想知道4x4矩阵是否包含有关摄像机本地和全局位置的信息。意思是我能够操纵矩阵来围绕外轴或点旋转摄像机吗?在给定此矩阵的情况下,我可以对相机做多少工作
答案 0 :(得分:1)
在回答真实的(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)据我所知
答案 1 :(得分:0)
在3D图形中,旋转由四元数表示,而不是矩阵。有一组函数来操作四元数。
您可以使用四元数perform rotation along any axis。您可以轻松地组合甚至(几乎不可能对矩阵)插值四元数。
可以将四元数转换为矩阵,这就是生成任何旋转矩阵的方式。 如果要将旋转应用于对象或将旋转与另一个变换(如平移或缩放)组合,则应首先将四元数转换为矩阵。
DirectX SDK是关于矩阵和四元数的重要信息来源,无论您实际使用哪种API - 所有3d API的数学都是统一的。
关于矩阵行/列含义的问题:矩阵可以表示非常复杂的变换,包括除了对象的几何中心之外的点的缩放或旋转。因此,您不应该以这种方式考虑矩阵,您应该将复杂矩阵想象为简单矩阵的乘法。