|
如题:
我用max做了一个漫游路径,导成了.path文件。通过自己写的界面的按钮可以随时启动AnimationPathManipulator来漫游整个场景,也可以随时切换操纵器到主相机的操纵器视角。但是感觉AnimationPathManipulator有记忆功能一样,每次从主相机的操纵器切换到场景漫游的AnimationPathManipulator时,漫游的起始位置总是接着上一次漫游停止时的位置。这个是为什么呢?能不能每次启动漫游时,都是从这个漫游路径的起始位置开始然后到结束呢?
部分代码:
//初始化漫游
bool FlybyEventHandler::intialFlybypath(osg::ref_ptr<osg::AnimationPath> _pCourseAnimationPath)
{
m_pCoursePath = _pCourseAnimationPath;
m_pAniPathManipulator = new osgGA::AnimationPathManipulator(m_pCoursePath);
m_dPathOffsetTime = 0.0;
m_dPathLastTime = m_pCoursePath->getPeriod();
return true;
}
//界面按钮调用这个函数启动漫游器
bool FlybyEventHandler::startFlyby()
{
m_PathFistframe_tick=osg::Timer::instance()->tick();
m_pViewer->setCameraManipulator(m_pAniPathManipulator.get());
return true;
}
//这个函数可以切换到主相机的操纵器,并且停止漫游
bool FlybyEventHandler::stopFlyby()
{
m_pViewer->setCameraManipulator(m_pMainCamera);
m_pMainCamera->m_pHostViewer =m_pViewer;
return true;
}
//FlybyEventHandler是GUI事件回调,这个函数里边可以自动停止漫游功能
bool FlybyEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa)
{
m_PathCurrentframe_tick=osg::Timer::instance()->tick();
m_dPathTotalTime=osg::Timer::instance()->delta_s(m_PathFistframe_tick,m_PathCurrentframe_tick);
//计算启动漫游的时间跟当前时间,并与漫游路径的周期比较,以自动结束漫游功能
if (m_dPathTotalTime>=m_pCoursePath->getPeriod())
// if (m_pViewer->getCameraManipulator()!=m_pMainCamera)
{
m_pViewer->setCameraManipulator(m_pMainCamera);
m_pMainCamera->m_pHostViewer =m_pViewer;
FlybyEventHandler::bFlyby=false;
}
return true;
}
可是,目前奇怪的是,每次执行startFlyby()时,漫游的位置都不一样。都不是漫游路径中的起始的位置。如果点击界面的stop按钮执行stopflyby()函数,下次启动startFlyby时,漫游路径的起始位置则是上次点击stopflyby()函数时漫游相机的位置,感觉操纵器自己有记忆功能。这个是什么原因呢?感谢大家不吝指教,论坛之前有相关帖子,可是最后都不了了之了。 |
|