第一日学习(一)osgViewer/ViewerBase.cpp( ViewerBase::frame())

本文解析了一个典型的三维渲染流程,包括初始化、时间推进、事件处理、数据更新及渲染等关键步骤。重点关注viewerInit(), realize(), advance(), eventTraversal(), updateTraversal() 和 renderingTraversals()等函数的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



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

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

    if (_firstFrame)
    {

//、如果这是仿真系统启动后的第一帧,则执行 viewerInit();此时如果还没有执行 realize() 函数,则执行它。 
        viewerInit();

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

        _firstFrame = false;
    }

//执行 advance 函数
    advance(simulationTime);

//执行 eventTraversal 函数,顾名思义,这个函数将负责处理系统产生的各种事件,诸 如鼠标的移动,点击,键盘的响应,窗口的关闭等等,以及摄像机与场景图形的事件回调 (EventCallback)。

    eventTraversal();

//执行 updateTraversal 函数,这个函数负责遍历所有的更新回调(UpdateCallback); 除此之外,它的另一个重要任务就是负责更新 DatabasePager 与 ImagePager 这两个重要的分 页数据处理组件。 
    updateTraversal();

//执行 renderingTraversals 函数,这里将使用较为复杂的线程处理方法,完成场景的筛 选(cull)和绘制(draw)工作。
    renderingTraversals();
}

 

 

下面写写学习体会。

这个流程是把初始化写在了每一帧中,用了bool变量避免重复初始化。然后推进时间,再加入输入和摄像机回调。再进行数据更新处理,最后多线程渲染。

 

基本上和gis引擎整合的流程一样。

 

在更新数据上,用了DatabasePager 与 ImagePager,应该更专业,这是初步体会,但是还没有看源码,所以说不出一二三来。

 

另外,这个时间推进是干啥的?根据<<windows游戏编程大师技巧>>中,输入应该是每帧的开始。也放在问号区。

 

总结下:

需要关注的函数:

frame()

{

viewerInit();

isRealized();

realize();

advance(simulationTime);

eventTraversal();

updateTraversal();

renderingTraversals();

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值