【问题标题】:4x4 Matrix decomposition algorithm4x4矩阵分解算法
【发布时间】:2012-09-17 10:21:24
【问题描述】:

我正在从事一个非常大的项目,我正在尝试重新审视和解决我已经有很长一段时间的问题:4x4 矩阵分解算法。

我正在编写一个商业游戏和模拟引擎。它是一个完全用 C# 编写的 API 和平台无关引擎。它使用 SlimDX 作为其 DirectX 后端,我可能会坚持使用 OpenTK 作为 OpenGL 后端。由于我不能依赖 DirectX 或 OpenGL 的数学库或数据类型(例如 Vector2、Vector3、Quaternion、Matrix 等),我不得不为引擎编写自己的类型。我已经完成了所有工作并进行了很好的优化;并且该 API 在语义上与 XNA 相似,因为我(和许多其他人)喜欢 XNA 的“感觉”并且觉得它非常优雅和强大。但不要混淆;本项目不使用XNA,也与XNA无关。无论如何,我能够处理除了一件事之外的所有事情...... Matrix.Decompose!!!

问题是,我根本不知道自己在做什么……我是一名自学成才的程序员,几乎所有其他方面都是自学的(商业金融、日间交易、德语等)。我就是这样学习的。我只有一年零一个学期的大学,所以我没有接受过复杂数学方面的正规教育。所以当我在维基百科上查看矩阵分解的公式时,它对我来说都是希腊语……一堆有趣的符号和图表对我来说毫无意义,哈哈。我一直是一个数学很差的学生,因为如果我不能将它实际应用到某些东西(比如游戏编程)上,我就会逃之夭夭。例如,我可以编写一个复杂的弹道物理模拟,但我什至无法帮助我的女朋友完成基本的物理和微积分作业,哈哈,因为这是一堆“高级”的理论数学,我无法弥合实用性或编程的差距.所以我很迷茫,不知道自己在做什么,非常沮丧......

具体来说,我需要做的是镜像 XNA Framework 和 DirectX 中的 Matrix.Decompose 的功能。我试图在 SlimDX 的源代码和 OpenTK 的源代码中寻找实现,但都没有实现! SlimDX 只是将工作推迟到本地 DirectX 库,而 OpenTK 甚至没有它。由于这个算法是一个巨大的、极其复杂的野兽,我并不感到惊讶,开发团队都不想实现自己的算法。但是我必须。

我已经尝试将 Wikipedia 和其他网站上的那些古怪公式转换为有效的 C# 算法,但我就是无法理解它。我真的需要在 C、C++ 或 C# 中看到它的工作实现,或者有人用伪代码或其他东西帮助我理解这一点。我只是无法掌握这些公式和“高级”数学理论。如果您能提供帮助(链接、工作实现、一些伪代码等),我们将不胜感激。

【问题讨论】:

  • 您是否尝试过使用 ILSpy 之类的工具反编译 XNA 实现?它可能会给你一些见解。或者 - 你可以只使用 XNA 的类。如果有人已经知道怎么做,为什么还要重新发明轮子?一般来说,在这样的事情上,很多人共同努力寻找我自己无法找到的解决方案。
  • 矩阵分解有很多种。你追求的是哪一个?
  • 也许来自 3-Blog 的 this article 可能会有所帮助。
  • 您还可以从 Bullet Physics 获得一些帮助,它是一个 C++ 库,其中包含 code 以将 3x3 矩阵转换为四元数(函数 getRotation)。
  • 我必须自己实现...记住,平台不可知论是引擎设计的要点之一。使用任何 XNA 库将意味着该方法仅适用于安装了 XNA 的 Windows/XBox。它引入了一个全新的依赖项……我的引擎根本不使用 XNA。几年前我确实对 XNA 进行了反编译,最近我再次查看了他们的算法,但看起来那个特定的方法被混淆了。它充满了一堆甚至不是合法的 C# 代码的废话,以及大量无意义的指针声明,例如“Vector3*** something = undeclaredIdentifier”...

标签: c# algorithm matrix game-engine


【解决方案1】:

查看DotNetMatrix,这是一个用于执行所有类型矩阵变换的 C# 库,包括我相信您正在寻找的 Cholesky Decomposition。此外,它的免费和源代码都包括在内!

【讨论】:

    【解决方案2】:

    最好的办法是使用现有的矩阵库。例如,查看 ILNumerics。它支持许多常见的矩阵分解(没有一个'矩阵分解'):http://ilnumerics.net/$FeatureList.html

    这是一个商业许可证,但是因为您是在销售引擎,所以这对您来说可能不是问题。

    免费的是Math.NET,但“分解和最小二乘问题”部分是空的,这让我相信他们还没有实现它。

    【讨论】:

    • 就像我说的...具体来说,我需要镜像 DirectX 和 XNA 中的矩阵分解。我不确定是哪一个,因为文档没有给出任何提示。它只是说它将矩阵分解为它的平移、旋转和缩放组件...结果是一个 Vector3 用于位置,一个 Vector3 用于 X、Y、Z 缩放和一个四元数用于旋转/方向...
    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 2020-02-22
    • 2010-11-12
    • 2015-07-26
    • 2017-08-21
    • 2014-11-13
    • 1970-01-01
    • 2021-03-19
    相关资源
    最近更新 更多