【问题标题】:4x4 3D Matrix Manipulation4x4 3D 矩阵操作
【发布时间】:2014-11-13 01:13:30
【问题描述】:

我目前正在使用 C# 开发一个游戏项目,并且正在研究在 3D 空间中移动相机。我有一个 4x4 全球世界矩阵。我了解这个矩阵处理对象在空间中的平移和旋转。我目前知道第三行处理对象的位置,因此我能够沿 xyz 平面移动相机。但是我想沿局部轴和全局轴执行旋转相机。参考this 帖子我知道如何旋转相机。但是,我希望更清楚地了解矩阵以及就平移和旋转而言各种行和列所代表的含义。我还想知道 4x4 矩阵是否包含有关相机本地和全局位置的信息。意思是我可以操纵矩阵围绕外轴或点旋转相机吗?给定这个矩阵,我可以对相机做多少

【问题讨论】:

    标签: c# object matrix 3d


    【解决方案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) 据我所知

    【讨论】:

      【解决方案2】:

      在 3d 图形中,旋转是用四元数而不是矩阵来表示的。有一组函数来操作四元数。

      你可以用四元数perform rotation along any axis。您可以轻松组合甚至(矩阵几乎不可能)插值四元数。

      四元数可以转换为矩阵,这就是生成任何旋转矩阵的方式。 如果要对对象应用旋转或将旋转与平移或缩放等其他变换相结合,则应先将四元数转换为矩阵。

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

      关于矩阵行/列含义的问题:矩阵可以表示非常复杂的变换,包括在对象几何中心以外的点上缩放或旋转。所以你不应该这样想矩阵,你应该把一个复杂的矩阵想象成简单矩阵的乘法。

      【讨论】:

      • 忽略这个关于四元数。如果您刚刚开始,这很复杂,而且大多数硬件无论如何都使用矩阵。它有它的位置(一个动画),但不是在这里。
      • 感谢您的回答,但我的问题是要执行哪些操作才能围绕特定轴进行此类旋转。 @skizz我对对象的当前矩阵做什么,例如可能围绕原点旋转它。是否有标准的矩阵运算来实现这一点?
      • D3DXMatrixRotationAxisglRotatef 可能是您正在寻找的。​​span>
      猜你喜欢
      • 2015-05-18
      • 1970-01-01
      • 2011-12-02
      • 2012-05-24
      • 2010-11-12
      • 1970-01-01
      • 2017-08-21
      • 1970-01-01
      • 2012-09-17
      相关资源
      最近更新 更多