1. 程式人生 > >【轉】osg 自動漫遊

【轉】osg 自動漫遊

介紹兩種漫遊方式,都是操作器的方式,但是都有所不同。
第一種為節點跟蹤漫遊器(NodeTrackerManipulator),主要是當前視點跟隨這個節點的包圍盒中心點,所以只要設定這個節點一個路徑動畫,那麼當前視點就跟著節點一起漫遊了。
第二種為路徑漫遊器(AnimationPathManipulator),主要是提前設定路徑(AnimationPath),可以設定這個路徑上的每個位置上的時間和旋轉量,但是在漫遊過程中不能修改當前的視點距離,只能按照提前設定好的視角和位置進行觀察。
下面給出這兩種方式的簡單示例程式碼:其中的路徑設定函式可以參考我前面文章關於路徑動畫的介紹,也可以自己寫。
其中main2使用的節點跟蹤漫遊器(可以一直跟者飛機移動視點),main使用的路徑漫遊器(當前視點會從牛屁股裡出來)。

 1 int main2()
 2 {
 3     osgViewer::Viewer viewer;
 4     viewer.addEventHandler(new ChangeWindow);
 5 
 6     osg::Group *pGroup = new osg::Group;
 7 
 8     osg::MatrixTransform* mt = new osg::MatrixTransform;
 9     osg::Node*glider = osgDB::readNodeFile("glider.osg");
10     mt->addChild(glider);
11 12 osg::Vec3 ptS = osg::Vec3(0,0,0); 13 osg::Vec3 ptE = osg::Vec3(-1000, 0, 0); 14 osg::AnimationPath* path = createAnimationPath(ptS, ptE, 0, 1000); 15 osg::NodeCallback* nc = new osg::AnimationPathCallback(path); 16 17 mt->setUpdateCallback(nc); 18 19 osgGA::NodeTrackerManipulator *tm = new
osgGA::NodeTrackerManipulator; 20 osgGA::NodeTrackerManipulator::TrackerMode trackerMode = osgGA::NodeTrackerManipulator::NODE_CENTER_AND_ROTATION; 21 osgGA::NodeTrackerManipulator::RotationMode rotationMode = osgGA::NodeTrackerManipulator::TRACKBALL; 22 23 tm->setTrackerMode(trackerMode); 24 tm->setRotationMode(rotationMode); 25 tm->setTrackNode(glider); 26 27 pGroup->addChild(mt); 28 29 pGroup->addChild(osgDB::readNodeFile("cow.osg")); 30 31 viewer.setCameraManipulator(tm); 32 viewer.setSceneData(pGroup); 33 viewer.run(); 34 return 0; 35 } 36 37 int main() 38 { 39 osgViewer::Viewer viewer; 40 viewer.addEventHandler(new ChangeWindow); 41 osg::Group *pGroup = new osg::Group; 42 43 osg::MatrixTransform* mt = new osg::MatrixTransform; 44 osg::Node*glider = osgDB::readNodeFile("glider.osg"); 45 mt->addChild(glider); 46 47 osg::Vec3 ptS = osg::Vec3(0,0,0); 48 osg::Vec3 ptE = osg::Vec3(-1000, 0, 0); 49 osg::AnimationPath* path = createAnimationPath(ptS, ptE, 0, 1000); 50 51 osg::NodeCallback* nc = 0; 52 nc = new osg::AnimationPathCallback(path); 53 54 osgGA::AnimationPathManipulator *pAn = new osgGA::AnimationPathManipulator(path); 55 56 pGroup->addChild(mt); 57 58 pGroup->addChild(osgDB::readNodeFile("cow.osg")); 59 60 viewer.setCameraManipulator(pAn); 61 62 viewer.setSceneData(pGroup); 63 viewer.run(); 64 return 0; 65 }

 


---------------------
作者:TheDeaf
來源:CSDN
原文:https://blog.csdn.net/mj511099781/article/details/47006757
版權宣告:本文為博主原創文章,轉載請附上博文連結!