OSG的诞生
在 1997 年时,Don Burns 由于喜欢滑翔机运动且对计算机图形学非常熟悉,在 LINUX 上写了一个控制滑翔
机的小引擎,这便是 OSG 的最初雏形。
后来在 1998 年,Don Burns 在滑翔机爱好者邮件列表中遇到了 Robert Osfield,对 OSG 的命运起到了决定性
的改变。我们现在在邮件列表中也会经常看到 Robert 的名字,从 98 年至今,Robert 一直担当 OSG 开发组
长,权衡 OSG 的各种利弊。
OSG的编译与安装
在Linux下,可直接去osg官方网站http://www.openscenegraph.org/下载压缩源码包编译安装,osg相关包如下:
osg-OpenSceneGraph-3.5.1.tar.gz, osg安装包,通过cmake编译,安装步骤参考目录下README.txt;
OpenSceneGraph-Data-3.0.0.tar.gz, 里面包含很多例子,例如著名的cow.osg;
如果应用需要使用地球或者数字城市,则可去http://osgearth.org/下载 osgearth,里面包含源码和例子.
osg基础
示例一:HelloWorld
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
int main()
{
<span style="white-space:pre"> </span>osgViewer::Viewer viewer;
<span style="white-space:pre"> </span>viewer.setSceneData(osgDB::readNodeFile("glider.osg"));
<span style="white-space:pre"> </span>viewer.realize();
<span style="white-space:pre"> </span>return viewer.run();
}
编译命令如下:g++ -o main main.cpp -losgDB -losg -losgViewer
下面我们对程序逐行解释:
第 1~2 行:头文件包含,这里osgDB用于读取模型文件,osgViewer用于在代码中使用osgViewer类,在编译时添加-losgViewer -losgDB也是同样的道理。
第 4~5 行:申请一个 viewer,可以理解为申请一个观察器,该观察可以查看模型。
第 6 行:设置观察器 Viewer 中的数据,换句话说,有了观察器, 就需要查看模型,模型可以绝对路径形式存在,比如 viewer.setSceneData(osgDB::readNodeFile("/home/lzn/osg_model/glider.osg"))。
OpenSceneGraph-Data-3.0.0.tar.gz中有提供glider.osg.
第 7 行:可以理解为这是在渲染前的最后一步,会检查和设置图形上下文,屏幕等,使 Viewer 的设置都生效。
第 8 行:渲染,可以用如下代码代替:while(!viewer.done()){viewer.frame();}.意思也就是说,只要 viewer 没有结束,那么就绘制它的每一个帧。
如果需要在运行时查看程序状态,则可修改为:
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgGA/StateSetManipulator>
int main()
{
osgViewer::Viewer viewer;
viewer.setSceneData(osgDB::readNodeFile("glider.osg"));
//添加状态事件
1: viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()));
//窗口大小变化事件
2: viewer.addEventHandler(new osgViewer::WindowSizeHandler);
<span style="white-space:pre"> </span>//添加一些常用状态设置
3: viewer.addEventHandler(new osgViewer::StatsHandler);
viewer.realize();
return viewer.run();
}
编译命令如下:
g++ -o main2 main2.cpp -losg -losgDB -losgViewer -losgGA
第 1 行:添加一个事件句柄,可以理解为添加一个响应,鼠标或是键盘的,这个响应可以看做响应键盘或是鼠标事件,故函数名字叫:addEventHandler[添加事件句柄]
。这个事件是库中自己写好的,叫做状态设置(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet())),其中我们点击 L 键时有操作器
的味道,所以叫状态设置操作器。众所周知,灯光是状态控制的,所以这句话可以控制 L 键开启与关闭灯光,至于为什么定位在 L 键上,怎么搞的,可以查看 StateSetManipulator 源码,我们以后也会写自己的操作器。发现默认的灯光比加强的 L 灯光好看一些,这是这个模型,大多数情况下都不是这样的。
第 2 行:添加的是窗口大小改变的句柄,这里响应的是 F 键,与上面的原理是差不多。在早期版本中,他们是在一起的,至 1.20 以后就把他们分开了。
第 3 行:添加常用的状态操作,这里会响应 S 键,W 键等等,原理与上述两个是一样的。
官方的四个osg程序
osgViewer:这四个程序当中用的最多的 OSG 程序,用于查看模型;
osgVersion:查看osg库版本;
osgArchive:类似于zip,可将多个.osg模型打包成一个.osga的模型压缩包;
osgConv:模型格式转换与压缩,将模型转换成二进制格式IVE,可防止别人查看和修改模型数据;
本文参考资料<openscenegraph程序设计>