
文章目录一 OpenSceneGraph 简介1 什么是 OpenSceneGraph2 OSG 中国3 OSG 组成模块二 OSG 开发1 开发环境2 环境设置3 Hello OSG 工程其他一 OpenSceneGraph 简介1 什么是 OpenSceneGraphOSG 是一个开源的场景图形管理开发库主要为图形图像应用程序的开发提供场景管理和图形渲染优化功能。2 OSG 中国2008年初成立的 OsgChina 是目前国内最大的专注于 OSG 发展和研究的网站和论坛以及 OSG 英文官方站点http://www.openscenegraph.org 的唯一中文镜像站。3 OSG 组成模块OpenScenceGraph 层次结构图如下图所示。OpenSceneGraph 及其扩展位于系统的API一级利用 OpenSceneGraph 可以轻松地开发其上层的应用程序。OSG 主要包括4个库1OSG 核心库Core Library。核心库主要用于实现最核心的场景数据库的组织和管理、对场景图形的操作以及外部数据库的导入提供接口等。它主要包括以下4个库。库名描述osg 库基本数据类负责提供基本场景图类构建场景图节点如节点类、状态类、绘制类、向量和矩阵数据计算以及一般的数据类osgUtil 库工具库类提供通用的公用类用于操作场景图形及内容如更新、裁减、遍历、数据统计及场景图的一些优化osgDB 库数据的读写库负责提供场景中数据的读写工作提供一个文件工具类。osgViewer 库OSG 2.0 后逐步发展稳定的一个视窗管理库可以集中各种窗体系统提供 OSG 与各种 GUI 的结合。2OSG 工具库NodeKit。工具库主要是对 OSG 核心库的扩充实现一些特定的功能。主要包括6个库。库名描述osgFX 库特殊效果节点工具用于渲染特效节点包括异性光照特效osgFXAnisotropic Lighting、凹凸贴图特效osgFX::BumpMapping、卡通渲染特效osgFX::Cartoon、刻线特效osgFXScribe、和立方图镜面高光特效osgFXSpecularHighlights等。osgParticle 库粒子系统的节点工具用于模拟各种天气或者自然现象效果如雨效、雪效和爆炸模拟等。osgSim 库虚拟仿真效果的节点工具用于特殊渲染如地形高程图、光点节点和DOF变换节点等。osgTerrain 库生成地形数据的节点工具用于渲染高程数据如TIF、IMAGE和DEM等各种高程数据格式。osgText 库文字节点工具用于向场景中添加文字信息支持TrueType字体。osgShadow 库阴影节点工具用于向场景中添加实时阴影提高场景渲染的真实性。3OSG 插件库。支持各种第三方库OSG 能够直接或者间接地导入3D模型或图片等场景数据。4OSG 内省库osgIntrospection。内省库提供一个与语言无关的运行程序接口确保了 OSG 可以在更多的环境下运行。综上OSG 的组成模块如下图所示二 OSG 开发1 开发环境操作系统Windows10及以上Qt 6.8.0 (MSVC 2022) Release2 环境设置1包含文件和库文件目录INCLUDEPATH$$PWD/xxx/osg/include LIBS-L$$PWD/xxx/osg/lib/-lOpenThreads-losg-losgAnimation-losgDB-losgFX-losgGA \-losgManipulator-losgParticle-losgParticle-losgPresentation \-losgQOpenGL-losgShadow-losgSim-losgTerrain-losgText \-losgUI-losgUtil-losgViewer-losgVolume-losgWidget2将osg动态库.dll拷贝到可执行文件所在目录3 Hello OSG 工程1Qt 中嵌入 OSG 窗口参考文档Qt 中嵌套 OSG 窗口Qt 中嵌入 OSG 窗口的方式有两种方式一是继承于 QOpenGLWidget方式二是继承 QOpenGLWidget 和 osgViewer::Viewer。本文采用方式二主要代码如下。// 头文件 view3d.hclass Viewer3D:public QOpenGLWidget,public osgViewer::Viewer{Q_OBJECT public:Viewer3D(QWidget*parentnullptr);~Viewer3D();protected:boolevent(QEvent*e)override;voidsetKeyboardModifiers(QInputEvent*event);voidkeyPressEvent(QKeyEvent*event)override;voidkeyReleaseEvent(QKeyEvent*event)override;voidmousePressEvent(QMouseEvent*event)override;voidmouseReleaseEvent(QMouseEvent*event)override;voidmouseDoubleClickEvent(QMouseEvent*event)override;voidmouseMoveEvent(QMouseEvent*event)override;voidwheelEvent(QWheelEvent*event)override;voidresizeEvent(QResizeEvent*event)override;voidmoveEvent(QMoveEvent*event)override;voidtimerEvent(QTimerEvent*event)override;voidpaintGL()override;private:voidinit3D();osg::ref_ptrosg::CameracreateCamera(intx,inty,intw,inth);private:osgViewer::GraphicsWindow*m_window;qreal m_scale;};// 初始化 osg 窗口voidViewer3D::init3D(){setCamera(createCamera(0,0,width(),height()));setCameraManipulator(new osgGA::TrackballManipulator);addEventHandler(new osgViewer::StatsHandler);addEventHandler(new osgViewer::ThreadingHandler());addEventHandler(new osgViewer::HelpHandler);addEventHandler(new osgGA::StateSetManipulator(this-getCamera()-getOrCreateStateSet()));setThreadingModel(osgViewer::Viewer::SingleThreaded);realize();getCamera()-setComputeNearFarMode(osg::CullSettings::COMPUTE_NEAR_FAR_USING_PRIMITIVES);getCamera()-setNearFarRatio(0.000003f);startTimer(10);}2Hello OSG 工程#includeosg/Node//核心库基本数据类。节点#includeosg/Geode//叶节点#includeosg/Group//组节点#includeosgDB/ReadFile//核心库数据的读写库#includeosgDB/WriteFile#includeosgUtil/Optimizer//核心库工具类库//创建 Viewer 对象场景浏览器Viewer3D*viewernewViewer3D(this);//创建场景组节点osg::ref_ptrosg::Grouprootnew osg::Group();//创建一个节点读取牛的模型osg::ref_ptrosg::NodenodeosgDB::readNodeFile(cow.osg);//添加到场景root-addChild(node.get());//优化场景数据osgUtil::Optimizer optimizer;optimizer.optimize(root.get());//设置场景数据viewer-setSceneData(root.get());从上面的程序可以看出构建 OSG 场景渲染程序的开发步骤如下设置编程环境指定头文件。创建场景浏览器用于渲染场景。设置场景数据从外部加载模型或者场景数据。设置场景数据为渲染场景建立场景树确定场景数据之间的关系。渲染实现场景渲染。3测试结果其他官方店https://2td9n4muhvgusvzepfo0a3cyfue8cph.taobao.com/