开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 12 天
1 概述
通过上一节,我们已经对OSG有了一个大致的了解,并且已经掌握了OSG的编译方法和开发环境的设置。下面来编写我们的第一个程序。
2 操作
启动VS2019,选择“新建”—“项目”命令,在Win32控制台下新建一个空项目 osgVR,在其中添加新建源文件 main.cpp,输入如下的代码。
#include <osgViewer/Viewer>
#include <osg/Node>
#include <osg/Geode>
#include <osg/Group>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <osgUtil/Optimizer>
int main()
{
//创建Viewer对象,场景浏览器
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
//创建场景组节点
osg::ref_ptr<osg::Group> root = new osg::Group();
//创建一个节点,读取牛的模型
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("cow.osg");
//添加到场景
root->addChild(node.get());
//优化场景数据
osgUtil::Optimizer optimizer ;
optimizer.optimize(root.get()) ;
//设置场景数据
viewer->setSceneData(root.get());
//初始化并创建窗口
viewer->realize();
//开始渲染
viewer->run();
return 0 ;
}
然后选择“项目”—“属性”命令,打开“osgVR属性页”对话框,展开“链接器”—“输入”节点,设置“附加依赖项”,输入“OpenThreads.lib osg.lib osgDB.lib osgFX.lib osgGA.lib osgManipulator.lib osgParticle.lib osgShadow.lib osgSim.lib osgTerrain.lib osgText.lib osgUtil.lib osgViewer.lib",单击“确定” 按钮,如下图所示。
这里在Release下编译,因为在Debug下编译程序可能会出现中断,不过,这都是正常的。如果选择在Debug下编译,只要在相应的库后面加上d即可,还有一点需要注意的是,Release下的库和Debug下的库不能混用,即不要在附加库中同时加入Release和Dubug下的库,应当分别与之对应使用,否则会出现运行错误或者无法意料的程序异常。
编译运行该程序,读者可以看到OSG中最熟悉的奶牛,如下图所示。
下面对程序中的代码进行简单的说明。
- 第6行:包含场景浏览器osgViewer:Viewer 类头文件。
- 第8~10行:包含场景中基本的节点类型—节点、叶节点、组节点的头文件。
- 第12~13行:包含读取文件函数的头文件。
- 第15行:包含优化场景数据的头文件。
- 第19行:创建场景浏览器,用于渲染场景模型数据。
- 第23行:创建场景数据根节点,用于添加模型文件数据,构建场景树。
- 第26行:从外部读取模型文件,加载模型文件到场景中。
从上面的程序可以看出,构建OSG场景渲染程序的开发步骤如下:
(1)设置编程环境,指定头文件。
(2)创建场景浏览器,通过osgViewer:Viewer类创建一个对象,用于渲染场景。
(3)设置场景数据,从外部加载模型或者场景数据。
(4)设置场景数据,为渲染场景建立场景树,确定场景数据之间的关系。
(5)渲染,进入循环,实现场景渲染。
本节介绍了一个最简单的OSG程序,通过上面的程序,读者应该了解了OSG程序的基本结构。可能还有读者有疑惑,没关系,通过以后的学习,会慢慢了解并熟悉所有的东西,成为OSG编程高手。