对于OSG中坐标及其转换的理解

注:读本博文前,你需要理解什么世界坐标和物体坐标以及OSG内部矩阵转换的特点(左乘)。

首先,OSG中所有对物体的矩阵变换都是该物体坐标系相对于世界坐标系的变换!这就意味A原位置是在世界坐标(10, 0, 0),再想通过平移变换到目的位置即世界坐标(20, 0, 0),你会发现左乘translate(osg::Vec3(20,0,0))后,它会放置在世界坐标(30, 0, 0)位置。其中的原因就是:预想中的变化是以A为中心的物体坐标系变换,但现实是以世界坐标为中心的世界坐标系变换。

其次,OSG中矩阵变化的顺序是左乘!这就是说,A原位置center,想要依次经过m1, m2, m3变换的正确语句是:destCenter = center*m1*m2*m3;同样如果变换后的位置是destCenter,想要回到原位置center,正确的语句是:destCenter*(-m3)*(-m2)*(-m1);

再其次,OSG中正确的矩阵变换级联顺序应该是:缩放(scale),旋转(rotate),平移(translate),简记SRT。其中的原因就是矩阵的变换的结果直接依赖于矩阵变换的顺序,顺序不同变换后的结果也是不同的(一般而言)。

最后,也是最重要的--标准变换。
根据上述变换的一般思想是:先将物体坐标系与世界坐标系重合(将物体平移中心Center回世界坐标系坐标原点),然后执行预期的操作,如SRT,最后再将物体平移到原来的中心点Center。
相关代码如下:
// 将想要进行矩阵变换的节点变为MatrixTransform,因为该类型才能获得该物体的表面顶点矩阵
osg::ref_ptr<osg::MatrixTransform> pMT = dynamic_cast<osg::MatrixTransform*>(node.get());

osg::Matrix mtMatrix = pMT->getMatrix(); // 物体表面的顶点矩阵
osg::BoundingSphere mtCenter = pMT->getBound(); // 获得物体的包围盒,以便取得物体中心点

// 将物体中心平移至世界坐标原点
osg::Matrixd matrixToWorldCenter = mtMatrix*osg::Matrixd::translate(-mtCenter.center());

// 物体将要做的矩阵变换
osg::Matrixd mtOperation = matrixToWorldCenter*osgMatrixd::scale()*
osg::matrxid::roate()*osg::Matrixd::translate();

 // 将结果矩阵重新平移回物体原来的中心店
osg::Matrixd matrixToOriginalCenter = mtOperation * osg::Matrixd::translate(mtCenter.center());
pMT->setMatrix(matrixToOriginalCenter);


  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值