osg19讲(Control)

osg结构图
在这里插入图片描述
其中每个类分别解析:

  1. osg::view
    在这里插入图片描述
    关键源码:
View::View():
    Object(true)
{
    // OSG_NOTICE<<"Constructing osg::View"<<std::endl;

    setLightingMode(HEADLIGHT);//设置灯光模式 (头灯,环境灯)

    _camera = new osg::Camera;//创建一个默认相机
    _camera->setView(this);

    double height = osg::DisplaySettings::instance()->getScreenHeight();
    double width = osg::DisplaySettings::instance()->getScreenWidth();
    double distance = osg::DisplaySettings::instance()->getScreenDistance();
    double vfov = osg::RadiansToDegrees(atan2(height/2.0f,distance)*2.0);

    _camera->setProjectionMatrixAsPerspective( vfov, width/height, 1.0f,10000.0f);

    _camera->setClearColor(osg::Vec4f(0.2f, 0.2f, 0.4f, 1.0f));//设置背景颜色

    osg::StateSet* stateset = _camera->getOrCreateStateSet();
    stateset->setGlobalDefaults();
}
  1. osg::viewerbase
    在这里插入图片描述
    关键源码:
    run->frame
void ViewerBase::frame(double simulationTime)
{
    if (_done) return;

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

    if (_firstFrame)
    {
        viewerInit();

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

        _firstFrame = false;
    }
    advance(simulationTime);

    eventTraversal();
    updateTraversal();
    renderingTraversals();
}
int ViewerBase::run()
{
    if (!isRealized())
    {
        realize();
    }

    unsigned int runTillFrameNumber = osg::UNINITIALIZED_FRAME_NUMBER;
    osg::getEnvVar("OSG_RUN_FRAME_COUNT", runTillFrameNumber);

    while(!done() && (runTillFrameNumber==osg::UNINITIALIZED_FRAME_NUMBER || getViewerFrameStamp()->getFrameNumber()<runTillFrameNumber))//是否关闭
    {
        double minFrameTime = _runMaxFrameRate>0.0 ? 1.0/_runMaxFrameRate : 0.0;
        osg::Timer_t startFrameTick = osg::Timer::instance()->tick();
        if (_runFrameScheme==ON_DEMAND)
        {
            if (checkNeedToDoFrame())
            {
                frame();
            }
            else
            {
                // we don't need to render a frame but we don't want to spin the run loop so make sure the minimum
                // loop time is 1/100th of second, if not otherwise set, so enabling the frame microSleep below to
                // avoid consume excessive CPU resources.
                if (minFrameTime==0.0) minFrameTime=0.01;
            }
        }
        else
        {
            frame();
        }

        // work out if we need to force a sleep to hold back the frame rate
        osg::Timer_t endFrameTick = osg::Timer::instance()->tick();
        double frameTime = osg::Timer::instance()->delta_s(startFrameTick, endFrameTick);
        if (frameTime < minFrameTime) OpenThreads::Thread::microSleep(static_cast<unsigned int>(1000000.0*(minFrameTime-frameTime)));//控制帧数
    }

    return 0;
}
void ViewerBase::viewerBaseInit()
{
    _firstFrame = true;//是否是第一帧,若为第一帧会调用viewerInit()
    _done = false;//是否继续渲染
    _keyEventSetsDone = osgGA::GUIEventAdapter::KEY_Escape;//设置退出键
    _quitEventSetsDone = true;
    _releaseContextAtEndOfFrameHint = true;//结束后是否释放上下文

    _threadingModel = AutomaticSelection;//渲染线程
    _threadsRunning = false;//线程状态
    _endBarrierPosition = AfterSwapBuffers;//线程同步
    _endBarrierOperation = osg::BarrierOperation::NO_OPERATION;
    _requestRedraw = true;//重新绘制
    _requestContinousUpdate = false;

    _runFrameScheme = CONTINUOUS;//帧更新策略
    _runMaxFrameRate = 0.0f;//帧数(通过计算当前帧数,若大于设置帧数则sleep休眠)

    std::string str;
    if (osg::getEnvVar("OSG_RUN_FRAME_SCHEME", str))
    {
        if      (str=="ON_DEMAND") _runFrameScheme = ON_DEMAND;
        else if (str=="CONTINUOUS") _runFrameScheme = CONTINUOUS;
    }

    osg::getEnvVar("OSG_RUN_MAX_FRAME_RATE", _runMaxFrameRate);

    _useConfigureAffinity = true;
}

最后常用的sogviewer::viewer
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值