查看: 2230|回复: 3

我是这么在运动过程中调整模型姿态的

[复制链接]

该用户从未签到

发表于 2012-8-15 11:16:42 | 显示全部楼层 |阅读模式
    当对一个物体进行先平移再旋转的操作时 ,目标是将物体沿 x轴正向平移 10个单位 ,再将物体自身绕z轴顺时针旋转 30度 ,但是在实际实施变换的过程中后 ,却得不到正确的结果.如图所示 ,图中水平垂直分别为 x, y坐标轴 , z坐标与纸面垂直.上一行是用户原来希望得到的结果 ,而下一行则是实际实施了变换之后得到的结果.
1.jpg
   在osgearth中,无论使用以下哪种都会发生这种现象。
//scale->postMult(osg::Matrix::rotate(osg:egreesToRadians(-90.0), 0, 1, 0));
//locator->getLocator()->setOrientation(osg::Vec3d(-90, 0, 0));

  看到一篇osg论文,使用在每次变换前先将物体平移至世界坐标系的原点 ,实施变换之后再将物体进行反平移的方法,实验证明是好用的,代码如下:

//获取场景节点 ,将其转换为 MatrixTransform类型
const osg::Matrix m_matrix = scale->getMatrix(); //获得变换物体表面顶点矩阵
const osg::BoundingSphere m_box = scale->getBound(); //获得变换物体的包围盒 ,从而获得物体的中心
osg::Matrix preMat = osg::Matrix::translate(-m_box.center()) ;
osg::Matrix proMat = osg::Matrix::translate(m_box.center()) ;
osg::Matrix matrix1 = m_matrix * preMat; //将物体中心平移至世界坐标的原点
osg::Matrix matrix2 = matrix1 * osg::Matrix::rotate(osg::DegreesToRadians(-90.0), 0, 1, 0);
//进行变换级联 ,采用先缩放后旋转再平移的顺序
osg::Matrix matrix =matrix2 * proMat; //变换后再将物体移回
scale->setMatrix(matrix) ; //将结果矩阵重新设回物体

不知道是否有更好的方法,盼高手指点

该用户从未签到

发表于 2012-8-15 12:32:37 | 显示全部楼层
一般是遵循SRT

该用户从未签到

 楼主| 发表于 2012-8-15 13:19:33 | 显示全部楼层
遵循SRT(Scale/Rotate/Translate)是在模型刚添加进场景的时候,在实时仿真的时候,一般不会知道模型移动到哪里了,这样移动之后再旋转,就会出现之前说的问题。虽然问题可以解决,但是我不确定这种解决办法是不是最好的或最有效的,所以想请教各位大牛!

该用户从未签到

发表于 2012-8-15 23:35:06 | 显示全部楼层
可以自己计算一下吧?cos,sina啥的。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表