osg结构图
其中每个类分别解析:
- 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();
}
- 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