osg 自动漫游

Posted tianshanhangui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
版权声明:本文为博主原创文章,转载请附上博文链接!










以上是关于osg 自动漫游的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL的视图变换与OSG漫游器

C++学习(三一四)osg漫游器Manipulator例子

[osg][osgEarth][原]基于OE自定义自由飞行漫游器(第二版)

[osg][osgEarth]EarthManipulator关于oe漫游器的handle部分解读

C++学习(三一五)osg漫游奇Manipulator自带事件Event响应

C++学习(三二零)osg漫游器Manipulator自带的鼠标拖拽事件Drag响应