MatrixTransform父子节点坐标系问题
任意MartixTransform节点可以通过调用getMatrix()方法获得从参考点变换到目前MartixTransform节点所在位置的矩阵Matrix。
每个模型都有自己的坐标系,比如有些飞机做成osg类型的文件时机头方向可能是z轴,有些机头方向却是x轴。这可以在外部软件如3dmax等进行修改,再打包模型。打包好的模型加载进osg中后,模型坐标系与模型保持相对静止,在模型加入到osg中时,模型的轴与世界坐标轴重合,原点相同。
如果对模型进行旋转操作,模型坐标轴将发生转变,进行旋转操作时模型坐标轴与世界坐标轴发生偏差;进行平移操作,模型原点与世界坐标原点发生偏差。
Osg中坐标计算顺序为自顶向下,先算父节点再算子节点,将变换矩阵都算完之后再付给模型node节点进行移动。设置矩阵变换的格式为
Matrixtransform*->setMatrix(osg::Matrix::scale(1,1,1) *
osg::Matrix::rotate() * osg::Matrix::translate());
首先设置缩放,再设置旋转,再设置平移。在程序运行时,计算的顺序是相反的,程序是从后向前调用方法,如上代码就是先translate再rotate再scale。计算完父类变换矩阵再计算子类变换矩阵。都是从后向前调用。如果是顶层父类节点(再往上就没有涉及位移-----即参考节点是世界坐标原点)可以看作是世界坐标(绝对坐标),顶层父类节点向下的都受父类节点约束,为相对坐标。以下列举一个示例:
//顶层父节点
osg::ref_ptr<osg::MatrixTransform> mt5 = new osg::MatrixTransform;
//设置沿x轴负方向平移15单位,绕z轴负方向旋转180度
mt5->setMatrix( osg::Matrix::rotate( osg::inDegrees(-