查看: 1270|回复: 1

重读《最长的一帧》 日志

[复制链接]

该用户从未签到

发表于 2016-3-17 15:06:58 | 显示全部楼层 |阅读模式
本帖最后由 1638403221 于 2016-3-17 15:13 编辑

仅为日后回忆梳理


void ViewerBase::frame(double simulationTime)
{
    if (_done) return;

    // OSG_NOTICE<<std::endl<<"CompositeViewer::frame()"<<std::endl<<std::endl;

    if (_firstFrame)
    {
    //Viewer::viewerInit函数只做了一件事,就是调用View::init()函数,而这个init函数的工
//作似乎也是一目了然的:无非就是完成视景器的初始化工作而已


//阅读某个函数的源代码过程中,如果能够大致知道这个函数的主要工作,并了解其中用
//到的变量的功能,那么即使只有很少的注释内容,应该也可以顺利地读完所有代码。如果对
//一些命名晦涩的变量不甚理解,或者根本不知道这个函数于运行流程中有何用途,那么理解
//源代码的过程就会麻烦很多。
      
        viewerInit();

        if (!isRealized())
        {
            realize();
        }

        _firstFrame = false;
    }
    advance(simulationTime);

//这个函数将负责处理系统产生的各种事件,诸
//如鼠标的移动,点击,键盘的响应,窗口的关闭等等,
//以及摄像机与场景图形的事件回调(EventCallback)。
    eventTraversal();
   
//这个函数负责遍历所有的更新回调(UpdateCallback);
//除此之外,它的另一个重要任务就是负责更新DatabasePager与ImagePager这两个重要的分
//页数据处理组件。
    updateTraversal();
   
//这里将使用较为复杂的线程处理方法,完成场景的筛
//选(cull)和绘制(draw)工作。
    renderingTraversals();
}




最长的一帧.rar

795.34 KB, 下载次数: 7, 下载积分: 威望 1

该用户从未签到

 楼主| 发表于 2016-3-17 15:11:43 | 显示全部楼层
//初始化

解读成果:
osgGA::EventQueue::createEvent,osgGA::MatrixManipulator::init,osgViewer::View::init,
osgViewer::Viewer::viewerInit


void View::init()
{
    OSG_INFO<<"View::init()"<<std::endl;

//View::init函数中出现了两个重要的类成员变量:_eventQueue和_cameraManipulator,
//并且还将一个osgGA::GUIEventAdapter的实例传入后者的初始化函数。


//_eventQueue 它用于储存该视景器的事件队列        
//_eventQueue除了保存一个GUIEventAdapter的链表之外,还提供了一系列对链表及其
//元素的操作函数,这其中,createEvent函数的作用是分配和返回一个新的GUIEventAdapter
//事件的指针。



//GUIEventAdapter :代表事件的类         它可以用于表达各种类型的鼠标、键盘、触压
//笔和窗口事件。在用户程序中,我们往往通过继承osgGA::GUIEventHandler类,并重写handle
//函数的方法,获取实时的鼠标/键盘输入,并进而实现相应的用户代码(参见
//osgkeyboardmouse)。
    osg::ref_ptr<osgGA::GUIEventAdapter> initEvent = _eventQueue->createEvent();
    initEvent->setEventType(osgGA::GUIEventAdapter::FRAME);
   
    //随后,这个新事件的类型被指定为FRAME事件,即每帧都会触发的一个事件。

//那么,_cameraManipulator呢?没错,它就是视景器中所用的场景漫游器的实例。通常
//我们都会使用setCameraManipulator 来设置这个变量的内容,例如轨迹球漫游器
//(TrackballManipulator)可以使用鼠标拖动来观察场景,而驾驶漫游器(DriveManipulator)
//则使用类似于汽车驾驶的效果来实现场景的漫游。

//如果读者希望自己编写一个场景的漫游器,那么覆写并使
//用osgGA::MatrixManipulator::init就可以灵活地初始化自定义漫游器的功能了,它的调用时
//机就在这里。
    if (_cameraManipulator.valid())
    {
        _cameraManipulator->init(*initEvent, *this);
    }
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表