查看: 2119|回复: 6

AnimationPathCallback问题

[复制链接]

该用户从未签到

发表于 2010-6-16 22:58:52 | 显示全部楼层 |阅读模式
请问:
   我利用AnimationPathCallback已实现AnimationPath中路径动画。

代码如下:
osg::ref_ptr<osg::AnimationPath> animationPath=new osg::AnimationPath();
...//设置
osg::Group* model = new osg::Group;   
osg::Node* auto1 = osgDB::readNodeFile(".\\models\\car.osg");
if(auto1)
    {
        osg::MatrixTransform* positioned=new osg::MatrixTransform;
        positioned->setDataVariance(osg::Object::STATIC);
        positioned->addChild(auto1);  
        osg:ositionAttitudeTransform* xform = new   osg::PositionAttitudeTransform;
        xform->setUpdateCallback(new osg::AnimationPathCallback(animationPath,0.0,1.0));
        xform->addChild(positioned);  
         model->addChild(xform);
     }
想实现汽车路径动画的同时,让汽车轮子(DOF)的旋转,请问如何实现。

该用户从未签到

发表于 2010-6-17 09:40:49 | 显示全部楼层
您看看这个例子说的事情是不是您要实现的:
http://www.openscenegraph.org/pr ... Tutorials/Callbacks

该用户从未签到

 楼主| 发表于 2010-6-17 10:04:23 | 显示全部楼层
2# aya_daxiang

谢谢!这个例子我已看过,现在DOF节点我已能实现运动控制,主要是想在xform->setUpdateCallback(new osg::AnimationPathCallback(animationPath,0.0,1.0));这一句中替换回调即
xform->setUpdateCallback(new MoveObjectForward(animationPath,0.0,1.0)

class MoveObjectForward:public osg::AnimationPathCallback
{
  public:
    MoveObjectForward::MoveObjectForward(osg::ref_ptr<osg::AnimationPath> animationPath,double timeoffset=0.0, double timeMultiplier=1.0)
   {      
      t1=0;
      this->setAnimationPath(animationPath.get());
      this->setTimeOffset(timeoffset);
      this->setTimeMultiplier(timeMultiplier);
   }

}
这样车子就无法运动了,即不沿预定路径移动了。这是为什么呢?谢谢!

该用户从未签到

发表于 2010-6-17 10:32:48 | 显示全部楼层
我按你这里说的试了一下,没有问题啊。从你上面给的程序来看,除了t1=0以外,MoveObjectForward 跟 AnimationPathCallback 并没有区别呀。你还是找一下看是不是别的地方有什么问题吧。

该用户从未签到

 楼主| 发表于 2010-6-17 12:22:20 | 显示全部楼层
4# aya_daxiang

谢谢,发现问题出在重载函数上,我在MoveObjectForward中加入
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv )  
{  
    osg:ositionAttitudeTransform*   pat=dynamic_cast<osg::PositionAttitudeTransform*>(node);
  if(pat)
        {   
            FindNodeVisitor findTurretNode("rrdof");
            osg::Node* auto1=dynamic_cast<osg::Node*>(node);
             auto1->accept(findTurretNode);
             osgSim:OFTransform *  turretDOF=dynamic_cast<osgSim::DOFTransform *> (findTurretNode.getFirst());
             if(turretDOF)
                {   
                  turretDOF->setCurrentHPR(osg::Vec3(0.0,0.0,t1*3.14/20));      
    }
       t1++;
  }
  traverse(node, nv);         
    }
后发现车辆在原点,轮子可以动,但无路径动画。

该用户从未签到

 楼主| 发表于 2010-6-18 09:30:49 | 显示全部楼层
已实现,主要是思路的问题,回调位置错了。谢谢aya_daxiang !

该用户从未签到

发表于 2010-6-18 10:48:31 | 显示全部楼层
不客气
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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