2014-09-18 146 views
0

我目前正在与C#合作开发一个游戏项目,并且正在致力于在3D空间中移动摄像头。我有一个4x4的全球世界矩阵。我明白这个矩阵处理空间中物体的平移和旋转。我现在知道第三行处理对象的位置,所以我可以沿着xyz平面移动摄像机。不过,我想要沿着本地轴和全局轴旋转相机。参考this我有一个想法如何旋转相机。然而,我想要更清楚地了解矩阵,以及关于翻译和旋转所涉及的各行和各列。我也想知道4x4矩阵是否包含有关摄像机局部和全局位置的信息。意思是我可以操纵矩阵来旋转相机的外部轴或点吗?在给定矩阵的情况下,我可以对相机做多少操作4x4 3D矩阵操纵

回答

0

在3d图形中,旋转用四元数表示,而不是用矩阵表示。有一组函数来操作四元数。你可以perform rotation along any axis你想要四元数。你可以很容易地组合,甚至(矩阵几乎不可能)内插四元数。

四元数可转换为矩阵,这就是如何产生任何旋转矩阵的方式。 如果要将旋转应用于对象或将旋转与其他变换(例如平移或缩放)结合使用,则应首先将四元数转换为矩阵。

DirectX SDK是关于矩阵和四元数的很好的信息来源,无论您实际使用哪种API - 数学在所有3d API中都是统一的。

关于矩阵行/列含义的问题:矩阵可以表示非常复杂的变换,包括除对象的几何中心之外的其他点的缩放或旋转。所以你不应该以这种方式考虑矩阵,你应该想象一个复杂的矩阵是一个简单矩阵的乘法。

+0

忽略这个关于四元数。如果你刚开始这很复杂,而且大多数硬件都使用matricies。它有它的地方(一个动画),但不在这里。 – Skizz 2014-09-18 16:46:16

+0

感谢您的答案,但我的问题是执行哪些操作来执行关于特定轴的这种旋转。 @skizz我该怎么做对象的当前矩阵,例如旋转它的原点或许。是否有标准的矩阵操作来实现这一点? – flexxxit 2014-09-18 18:33:45

+0

[D3DXMatrixRotationAxis](http://msdn.microsoft.com/en-us/library/windows/desktop/bb205357(v = vs.85).aspx)或[glRotatef](http://msdn.microsoft.com /en-us/library/dd368577(v=vs.85).aspx)可能是你在找什么。 – 2014-09-19 02:55:09

0

在回答真正的(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)据我所知