查看: 2446|回复: 9

osg 绕平行于z轴的旋转轴 的旋转问题

[复制链接]

该用户从未签到

发表于 2011-3-31 22:17:12 | 显示全部楼层 |阅读模式
本帖最后由 chenwei2007gs 于 2011-3-31 22:19 编辑

程序的大概结构如下
class Parent:  //定义继承自osg::MatrixTransform的类
public osg::MatrixTransform
{
public:
Parent(void);
~Parent(void);
public:
void setRotation(osg::Vec3& rot);  //定义外板旋转函数
void setPositon(osg::Vec3& pos);

osg::Matrixd* getWorldCoords( osg::Node* node);  //用于获得Son自身坐标系相对与世界坐标系的变换矩阵

void update(void);                 //定义更新函数
Private:
Son* _Son;//继承自PositionAttitudeTransform的类
};

void Parent:arent(void)
{
_Son=new Son;
this->addchild(_son);//添加_son为子节点
_Son->setPosition(pos);
_Son->setRotation(rot);//定义son位置

this->setUpdateCallback(new UpdateCallback());
}

void Parent::update(void)
{
    m=getWorldCoords(_Son);获得son在世界坐标系中的位置

    m->decompose(temp_tran,temp_rota,temp_sca,temp_so);

    R = 5000;//定义Son的旋转半径

    angle=angle+pi/30;//定义Son旋转的角度增量

    ref_coor._v[0]=0;ref_coor._v[1]=R;ref_coor._v[2]=0;// son绕偏移自身坐标系y方向R处的位置旋转

    abs_coor=temp_tran+temp_rota*ref_coor;//定义Son的旋转轴在世界坐标系中位置

    mm=osg::Matrix::translate(-abs_coor)*osg::Matrix::rotate(angle,osg::Vec3(0.0,0.0,1.0)) *osg::Matrix::translate(abs_coor);//平移旋转轴

    this->setMatrix(mm);
}

如果按上面的update,出来的结果是son在某段区域内正常旋转,而在某段区域将出现跳动,位置变化幅度很大
如果将上面的update修改之后,

void Parent::update(void)
{
   osg::ref_ptr<osg::MatrixTransform> mp = new osg::MatrixTransform;
   this->addchild(mp);
   mp->addchild(_son);

   m=getWorldCoords(_Son);获得son在世界坐标系中的位置

    m->decompose(temp_tran,temp_rota,temp_sca,temp_so);

    R = 5000;//定义Son的旋转半径

    angle=angle+pi/30;//定义Son旋转的角度增量

    ref_coor._v[0]=0;ref_coor._v[1]=R;ref_coor._v[2]=0;// son绕偏移自身坐标系y方向R处的位置旋转

    abs_coor=temp_tran+temp_rota*ref_coor;//定义Son的旋转轴在世界坐标系中位置

    mm=osg::Matrix::translate(-abs_coor)*osg::Matrix::rotate(angle,osg::Vec3(0.0,0.0,1.0)) *osg::Matrix::translate(abs_coor);//平移旋转轴

    mp->setMatrix(mm);
}
在开头添加osg::ref_ptr<osg::MatrixTransform> mp = new osg::MatrixTransform;this->addchild(mp);mp->addchild(_son);结尾去掉“this->setMatr(mm);”改为mp->setMatrix(mm);改后出现的结果是能正常旋转但会留下阴影

原型

原型

修改后旋转

修改后旋转

请问这事怎么一回事,能有什么办法去除这些阴影吗,我用removechild试过了,但不行

该用户从未签到

发表于 2011-4-1 12:47:59 | 显示全部楼层
您说的阴影是什么?我不理解

该用户从未签到

 楼主| 发表于 2011-4-1 16:39:25 | 显示全部楼层
回复 2# array
你看第2张图片,这事第1张图中的模型旋转后的结果,怎么会出现这种情况,它旋转过程中怎么会出现痕迹的

该用户从未签到

发表于 2011-4-2 08:44:22 | 显示全部楼层
什么痕迹,请指出

该用户从未签到

 楼主| 发表于 2011-4-2 09:11:52 | 显示全部楼层
回复 4# array


    就是第一幅图绕轴旋转之后会保留上一帧的状态 QQ截图未命名.JPG ,这是旋转角增量改大了之后的效果

该用户从未签到

发表于 2011-4-2 12:34:53 | 显示全部楼层
您是不是一直在添加新的子节点啊
osg::ref_ptr<osg::MatrixTransform> mp = new osg::MatrixTransform;
this->addchild(mp);
mp->addchild(_son);

我一直以为这是您的正常需求,如果不是这样的话,那么您的程序逻辑就有错误啊

该用户从未签到

 楼主| 发表于 2011-4-2 13:48:07 | 显示全部楼层
回复 6# array


    是啊,问题就处在这里,如果不添加mp的话,直接用this->addchild(mm)最终出现的动画除了旋转,还会随意跳动,请问该怎么解决呢

该用户从未签到

 楼主| 发表于 2011-4-2 13:50:22 | 显示全部楼层
回复 6# array

刚才回复错了,应该是如果直接用 this->setMatrix(mm),就会出现随意跳动,而不是旋转了,请问该怎么解决

该用户从未签到

发表于 2011-4-6 08:36:55 | 显示全部楼层
显然这里您应该用动画路径AnimationPath或者自己的方法来实现平滑的过渡过程

该用户从未签到

 楼主| 发表于 2011-4-6 21:17:22 | 显示全部楼层
回复 9# array


    谢谢array,我已经解决了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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