我正在尝试从一个直接模式的OpenGL程序导出一个场景到VRML.
在OpenGL和VRML中,可以将面分组到对象中,这些对象具有各自相对于场景原点的平移、旋转和缩放。
在OpenGL中,它们被存储为一个4-矩阵,表示一个矩阵[1]中的平移和旋转/缩放。在VRML中,这些必须分别表示为[3]的平移、旋转和缩放向量。
我如何用这种方式分解一个任意的4-矩阵?
我更喜欢使用库函数来做这件事,以最小化我必须维护的代码,并减少出错的机会。我在Windows上使用C#,可以访问任何CLR或windows原生DLL。
发布于 2012-06-08 04:46:13
发布于 2012-06-08 06:17:11
我如何用这种方式分解一个任意的4-矩阵?
转换的最右边一列是平移向量T。
比例和旋转是更复杂的提取。你需要找到旋转轴和旋转角。基本上,您在这里处理的是一个特征向量问题:找到在矩阵变换下不变的向量。这就是特征向量的情况。旋转是正交变换。因此,旋转矩阵的任何非法线部分都是缩放。您可以通过首先对矩阵进行正交归一化来提取这种缩放,从而得到缩放因子S。最后,您可以解决特征向量问题,找到两个反平行的特征向量,它们是旋转轴。相应的特征值指定旋转的cos(),它提供旋转轴和角度R。
发布于 2014-10-12 01:01:52
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);
}一些浏览器支持将scaleOrientation和getTransform参数作为第四个和第五个参数。
https://stackoverflow.com/questions/10939200
复制相似问题