我正在尝试将场景从直接模式OpenGL程序导出到VRML。
在OpenGL和VRML中,人脸可以分组为具有相对于场景原点的平移,旋转和缩放的对象。
在OpenGL中,这些被存储为4矩阵,表示平移和一个矩阵[1]中的旋转/比例。在VRML中,这些必须表示为单独的平移,旋转和缩放向量[2] [3]。
如何以这种方式分解任意4矩阵?
我更喜欢使用库函数来执行此操作,以最小化我必须维护的代码并减少出错的可能性。我在Windows上使用C#,可以访问任何CLR或Windows本机DLL。
答案 0 :(得分:1)
答案 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参数作为第四和第五个参数。