突然觉得调试更一目了然。避免“看过就学会,收藏即学习”
先加载个牛

直奔主题frame()

这里用到的是基类viewerBase::frame(),单视景器和多视景器都调用它。这里是单视景器

视景器初始化

转到了osgViewer::viewer::Init(),

为什么呢?因为主函数调用就是单视景器
![]()
osgViewer::Viewer派生自ViewerBase和osgViewer::View,所以调用的是基类ViewerBase的frame()

那为啥不继续子类调用父类了呢?因为是个纯虚函数。该父类调用子类了。

然后,继续啃另外一个爹,父类osgViewer::View的初始化。这里先总结下,每个事件是GUIEventAdapter,每个窗口有一个事件队列EventQueue,EventQueue的成员变量_eventQueue是存储事件的链表,即GUIEventAdapter->_eventQueue->osg::ref_ptr<osgGA::EventQueue> _eventQueue;->View(这两个_eventQueue不是同一个意思,一个是链表,一个是EventQueue对象)

涉及到了两个成员变量

1,第一个成员变量_eventQueue
从类的注释看,osgGA::EventQueue收集单个窗口事件,也就是说,每个窗口都有个事件队列。

事件列表及操作,一堆GUIEventAdapter

既然与窗口事件相关,那就与上下文相关,鼠标范围相关(范围以外点击不引起鼠标事件),

鼠标有各种事件

键盘有各种事件

窗口有各种事件


时间相关事件

用户自定义事件(相当重要,可以自定义封包)

事件状态

这些事件都是互斥保护
![]()
列表中保存的这一堆GUIEventAdapter,很明显就是窗口、鼠标、键盘等交互事件了

看成员变量

2,第二个成员变量osg::ref_ptr<osgGA::MatrixManipulator> _cameraManipulator;漫游器
从定义看出,漫游器是个继承自GUIEventHandler的抽象类,也就是说,实际应用还需要再派生

一般通过继承osgGA::GUIEventHandler类,并重写handle()函数,再派生。
拉回来,继续调试下去
//分配和返回一个新的GUIEventAdapter事件指针



事件类型:
![]()


这个例子用的是KeySwitchMatrixManipulator
![]()


_current是选中的漫游器
![]()
这里选中的是轨迹球漫游器


这两个名字起的也太任性了

第一天结束。

1041

被折叠的 条评论
为什么被折叠?



