将OpenGL 4矩阵转换为VRML T*R*S

将OpenGL 4矩阵转换为VRML T*R*S,opengl,3d,linear-algebra,vrml,x3d,Opengl,3d,Linear Algebra,Vrml,X3d,我正在尝试将场景从直接模式OpenGL程序导出到VRML 在OpenGL和VRML中,可以将面分组为对象,并具有相对于场景原点的平移、旋转和缩放 在OpenGL中,它们存储为4矩阵,表示一个矩阵中的平移和旋转/缩放。在VRML中,这些必须表示为单独的平移、旋转和缩放向量 如何用这种方法分解任意4-矩阵 我更愿意使用库函数来实现这一点,以尽量减少我必须维护的代码,并减少出错的机会。我在Windows上使用C#,可以访问任何CLR或Windows本机DLL。查看Monogame源代码中的 -Open

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

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

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

如何用这种方法分解任意4-矩阵

我更愿意使用库函数来实现这一点,以尽量减少我必须维护的代码,并减少出错的机会。我在Windows上使用C#,可以访问任何CLR或Windows本机DLL。

查看Monogame源代码中的

-OpenGL矩阵以列为主,DirectX/XNA以行为主

希望有帮助

如何用这种方法分解任意4-矩阵

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


比例和旋转提取起来有点复杂。您需要找到旋转轴和旋转角度。基本上你在处理一个特征向量问题:找到在矩阵变换下不变的向量。这是特征向量的情况。旋转是正交变换。因此,旋转矩阵的任何非法线部分都是缩放。您可以通过首先对矩阵进行正交规格化来提取此缩放,从而生成缩放因子S。最后你可以解决特征向量问题,找到两个反平行的特征向量,即旋转轴。相应的特征值指定旋转的cos(α),这为您提供旋转轴和角度RSFMatrix4f/d和SFMatrix3/d具有内置函数,用于分解矩阵的组件。以下是规范中的页面:

在JavaScript中,您可以键入:

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

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

一些浏览器支持将第四个和第五个参数作为转换scaleOrientation和center参数的参数。

特征向量分解是不够的,因为我的一些矩阵是旋转和缩放组合的。我要的是一个库函数,而不是关于线性数学的模糊段落。@Rich:是的,这就足够了,因为您事先通过规范化旋转矩阵提取了比例,从而有效地吐出了比例因子。至于图书馆。任何线性数学库都可以实现这些功能。比如Eigen(谷歌it)。如果您想要更小的,可以使用my,它提供了一个函数,可以将4×4旋转矩阵转换为四元数。一个标准化的四分之一是一个有效的旋转轴和一个角度。谢谢,这看起来很理想。我会尝试一下,如果你的答案有效的话,我会接受你的答案。这有很多必要的东西,但有几个地方不够。首先,它使用四元数,而VRML需要轴角度,并且该库没有四元数->轴角度函数。我正在尝试添加一个,但我希望有一个图书馆,我可以顺便去看看。其次,它分解M->SRT(我认为),而VRML需要M->TRS。我可能可以通过使用多个翻译节点来实现这一点。