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

时间:2012-06-07 20:15:20

标签: opengl 3d linear-algebra vrml x3d

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

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

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

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

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

3 个答案:

答案 0 :(得分:1)

查看Monogame来源的Matrix.Decompose code

Remember - OpenGL矩阵是列专业,DirectX / XNA是行专业。

希望有所帮助。

答案 1 :(得分:1)

  

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

转化的最右边一列是翻译向量 T

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

答案 2 :(得分: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参数作为第四和第五个参数。