先列上两个链接介绍osg中的矩阵变换。
http://www.cnblogs.com/indif/archive/2011/05/13/2045106.html
http://www.cppblog.com/acmiyou/archive/2009/08/24/94292.html
opengl中矩阵是列主序,osg中是行主序。
个人觉得这样从应用上去考虑原因,opengl是最低层低级的软件和硬件的接口,考虑的是高效性
能,osg是高级三维引擎,考虑的是应用和便于理解。opengl中的矩阵使一个16大小的一维数组
,因此在进行矩阵运算的时候只需要指针++就可以到下一个。
而实际的应用中,我们一般理解点是行主序的三个数,
osg当中: newpos =oldpos * T *R //先执行平移 后执行旋转 (全局坐标系)
因此执行以上的变换,先平移后旋转,很容易理解。
在来说一下MatrixTransform 和PositionAttitudeTransform,一个是矩阵变换一个是位置姿态
,MatrixTransform 是按着矩阵相乘的顺序做变换,而PositionAttitudeTransform是按着SRT的
顺序变换,所以对于PositionAttitudeTransform无论是先设置位置旋转缩放还是后设置结果都
一样。我们从源代码中看个究竟。
对于MatrixTransform
bool MatrixTransform::computeLocalToWorldMatrix(Matrix& matrix,NodeVisitor*) const
{
if (_referenceFrame==RELATIV
http://www.cnblogs.com/indif/archive/2011/05/13/2045106.html
http://www.cppblog.com/acmiyou/archive/2009/08/24/94292.html
opengl中矩阵是列主序,osg中是行主序。
个人觉得这样从应用上去考虑原因,opengl是最低层低级的软件和硬件的接口,考虑的是高效性
能,osg是高级三维引擎,考虑的是应用和便于理解。opengl中的矩阵使一个16大小的一维数组
,因此在进行矩阵运算的时候只需要指针++就可以到下一个。
而实际的应用中,我们一般理解点是行主序的三个数,
osg当中: newpos =oldpos * T *R //先执行平移 后执行旋转 (全局坐标系)
因此执行以上的变换,先平移后旋转,很容易理解。
在来说一下MatrixTransform 和PositionAttitudeTransform,一个是矩阵变换一个是位置姿态
,MatrixTransform 是按着矩阵相乘的顺序做变换,而PositionAttitudeTransform是按着SRT的
顺序变换,所以对于PositionAttitudeTransform无论是先设置位置旋转缩放还是后设置结果都
一样。我们从源代码中看个究竟。
对于MatrixTransform
bool MatrixTransform::computeLocalToWorldMatrix(Matrix& matrix,NodeVisitor*) const
{
if (_referenceFrame==RELATIV