先看看总体进展,
eventTraversal函数的任务:在每帧仿真过程中,取出已经发生的所有事件,摒弃哪些对场景不会有助益的(比如, 在视口外的鼠标事件),依次交付给各个事件处理器,最后清空现有的事件队列,等待下一帧的到来。
在View的几个成员变量中,
_eventHandler处理由图形设备传递到事件队列_eventQueue的各种事件。
添加事件处理器由View::addEventHandler添加,
事件处理器可以通过继承事件处理器基类osgGA::GUIEventHandler,重写handle()函数,实现自定义的交互事件相应流程。
调试进去看看
窗口坐标 = 世界坐标*摄像机坐标系*投影坐标系*窗口坐标系;
分开来,就是
摄像机坐标 = 世界坐标* 摄像机坐标系;
投影坐标 = 摄像机坐标 * 投影坐标系
窗口坐标 = 投影坐标 *窗口坐标系.
osg的事件队列是由一个GUIEventAdapter事件组成的链表,比如鼠标移动,按键按下,窗口尺寸等动作,都会作为一个新的GUIEventAdapter对象插入到链表中,(
比如,mouseMotion,keypress和windowResize,并间接地调用EventQueue::addEvent函数,而这些事件之间可能共通的参数和状态就从“状态事件”中读取,比如鼠标移动时,鼠标坐标XY就是状态事件,可以在不同的事件中更新坐标,然后传递。