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程式設計>