【发布时间】: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