在以前的版本中,可以很简单的使用setTetherNode进行视点跟踪设置。
以前的方法:
osg::ref_ptr<osg::Group> mRoot = new osg::Group(); //设置根节点
osgViewer::Viewer * pViewer = new osgViewer::Viewer();
osg::MatrixTransform* mtFly = new osg::MatrixTransform;//创建一个模型
mRoot->addChild(mtFly);//将模型放进根节点
//初始化一个操作器
osg::ref_ptr<osgEarth::Util::EarthManipulator> em = new osgEarth::Util::EarthManipulator;
pViewer->setCameraManipulator(em.get());
pViewer->setSceneData(mRoot.get());//添加到场景
pViewer->realize();
//路径的生成这里不细说了,直接略过了
mtFly->setUpdateCallback(new osg::AnimationPathCallback(apc,0.0,1.0));
em->setTetherNode(mtFly);
现在的方法:
osg::ref_ptr<osg::Group> mRoot = new osg::Group(); //设置根节点
osgViewer::Viewer * pViewer = new osgViewer::Viewer();
osg::MatrixTransform* mtFly = new osg::MatrixTransform;//创建一个模型
mRoot->addChild(mtFly);//将模型放进根节点
//初始化一个操作器
osg::ref_ptr<osgEarth::Util::EarthManipulator> em = new osgEarth::Util::EarthManipulator;
pViewer->setCameraManipulator(em.get());
pViewer->setSceneData(mRoot.get());//添加到场景
pViewer->realize();
//路径的生成这里不细说了,直接略过了
mtFly->setUpdateCallback(new osg::AnimationPathCallback(apc,0.0,1.0));
//下面是区别
//获取当前操作器的视点,将模型放进这个视角中,然后设置这个视角的一些参数,比如从哪个角度和距离观察模型。然后将这个视点设置为操作器的视点。
osgEarth::Viewpoint vp = m_em->getViewpoint();
vp.setNode(mtFly);
vp.range()->set(250000.0, osgEarth::Units::METERS);//观察的距离
vp.pitch()->set(-45.0, osgEarth::Units::DEGREES);//观察的角度
em->setViewpoint(vp, 1.0);
另外,视点必须在viewer执行senScenceData之后才会有效。