查看: 4380|回复: 6

osg中怎么使物体沿一个路径文件中的路径运动?

[复制链接]

该用户从未签到

发表于 2008-3-19 09:11:54 | 显示全部楼层 |阅读模式
如题,Vega中有这样的功能,在osg中怎么实现?最好能给个例子,谢谢! 急!!!

该用户从未签到

发表于 2008-3-19 12:58:06 | 显示全部楼层
参看viewer源码中的按下Z键时录像回放就知道了~~~~~呵呵~~~~~~~~~~
  • TA的每日心情
    开心
    2019-11-11 10:36
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2008-3-19 13:19:48 | 显示全部楼层
    如何使用PATH文件:

    第一步:申请一个操作器,

    第二步:申请一个Animationpath(因为我们在viewer没有保存AnimationPath我们需要从文件中获得),

    第三步:从文件中读入AnimationPath,第四步加入到操作器中,第五步viewer选择该镜头进行操作。

    std::string filename("PATH.path");
      //申请一个输入流,属于C++的语法知识
            std::ifstream in(filename.c_str ()) ;
      //申请一个AnimationPath
            osg::AnimationPath *amp = new osg::AnimationPath ;
            //从文件中读入到AnimaitonPath中
    amp ->read (in) ;
    //关闭流
            in.close () ;

      //PATH操作器
            osgGA::AnimationPathManipulator* apm  = new osgGA::AnimationPathManipulator ();
      //操作器ID
            unsigned int apmNo = 0;     
                                  
            //把操作器加入到viewer中
    apmNo = viewer->addCameraManipulator(apm);                          
            //设置路径到操作器中
    apm->setAnimationPath(amp)  ;       
            //选择该操作器进行漫游(经过上面的操作,该操作器已经有从刚才文件中的PATH了)
    viewer->selectCameraManipulator(apmNo);

    该用户从未签到

     楼主| 发表于 2008-3-19 13:52:03 | 显示全部楼层
    我说的是物体(就是场景图中的一个节点)沿固定路径运动,怎么实现?
  • TA的每日心情
    开心
    2019-11-11 10:36
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2008-3-19 13:58:22 | 显示全部楼层
    这样啊,,,,例子一大把啊,,,,你看看这个例子:
    osganimate


    在这里我简单的讲解一下思路:

    首先让物体沿固定路径运动,如果说你物体本身有动画,那就不说了,控制就可以了,

    现在是用户自己编辑关键点,思路就是

    第一步:取点
    第二步:把这些点输入到关键点
    第三步:确定步速
    第四步:形成路径
    就是这样的,这个例子体现了这些思路

    该用户从未签到

     楼主| 发表于 2008-3-19 16:26:34 | 显示全部楼层
    实现了,在物体节点上加一个更新回调就可以
    osg:: PositionAttitudeTransform* xform = new osg:: PositionAttitudeTransform;
    osg::AnimationPath* animationPath = createAnimationPath(path);
    xform->setUpdateCallback(new osg::AnimationPathCallback(animationPath,0.0,1.0));
    xform->addChild(object);
    其中createAnimationPath定义如下:
    createAnimationPath(std::string& path)
    {
       std::ifstream in(path.c_str());
       osg::AnimationPath* amp = new osg::AnimationPath;
       amp->read(in);
       in.close();
       return  amp;
    }
    还是蛮简单的,谢谢版主!

    [ 本帖最后由 npu_feiyi 于 2008-3-19 16:29 编辑 ]
  • TA的每日心情
    开心
    2019-11-11 10:36
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2008-3-19 19:34:51 | 显示全部楼层
    不用谢谢
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

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

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

    联系我们

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