2

我正在尝试将场景从直接模式 OpenGL 程序导出到 VRML。

在 OpenGL 和 VRML 中,可以将面分组为具有自己相对于场景原点的平移、旋转和缩放的对象。

在 OpenGL 中,这些存储为一个 4 矩阵,表示一个矩阵中的平移和旋转/缩放[1]。在 VRML 中,这些必须表示为单独的平移、旋转和缩放向量[2] [3]

如何以这种方式分解任意 4 矩阵?

我更喜欢使用库函数来执行此操作,以最大限度地减少我必须维护的代码并减少出错的机会。我在 Windows 上使用 C#,可以访问任何 CLR 或 Windows 本机 DLL。

4

3 回答 3

1

看看Monogame 源代码中的 Matrix.Decompose 代码。

请记住- OpenGL 矩阵是列优先的,而 DirectX/XNA 是行优先的。

希望有帮助。

于 2012-06-07T20:46:13.213 回答
1

如何以这种方式分解任意 4 矩阵?

变换的最右边一列是平移向量T

提取比例和旋转有点复杂。您需要找到旋转轴和旋转角度。基本上你在这里处理一个特征向量问题:找到在矩阵变换下不变的向量。这就是特征向量的情况。旋转是正交变换。因此,旋转矩阵的任何非正常部分都是缩放。您可以通过首先对矩阵进行正交归一化来提取此缩放,从而产生缩放因子S。最后,您可以解决特征向量问题以找到两个反平行特征向量,即旋转轴。相应的特征值指定旋转的 cos(α),它为您提供旋转轴和角度R。

于 2012-06-07T22:17:10.903 回答
0

SFMatrix4f/d 和 SFMatrix3/d 具有在其组件中分解矩阵的内置函数。这是规范中的页面:http ://www.web3d.org/documents/specifications/19777-1/V3.0/Part1/functions.html#t-Matrix4Functions 。

在 JavaScript 中,您可以键入:

function foo (matrix4f)
{
   var translation = new SFVec3f ();
   var rotation    = new SFRotation ();
   var scale       = new SFVec3f ();

   matrix4f .getTransform (translation, rotation, scale);
}

一些浏览器支持作为第四个和第五个参数来 getTransform 一个 scaleOrientation 和 center 参数。

于 2014-10-11T17:01:51.830 回答