一篇看懂osg矩阵父子关系与绝对/相对坐标系问题

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(-
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值