♆1-OSG 概述
目錄
- OSG組成模塊
- OSG環境搭建
- 第一個工程
- OSG實用工具
- 一、場景瀏覽器osgViewer
- 二、版本信息查看器osgVersion
- 三、場景圖形壓縮歸檔工具osgArchive
- 四、數據轉換工具osgConv
OSG組成模塊
OpenSceneGraph及其擴展位于系統的API一級,即系統的底層繪圖硬件和相應的軟件驅動程序之上封裝了OpenGL,并對其余的底層圖形顯示方式予以支持,利用OpenSceneGraph可以輕松地開發其上層的應用程序。
OSG層次結構圖如下圖所示:
OSG主要包括4個庫,下面分別進行介紹。
一、OSG核心庫(CoreLibrary)
核心庫是OSG的核心,也是其存在且不斷得到發展的根本原因。它的主要功能就是實現最核心的場景數據庫的組織和管理、對場景圖形的操作以及為外部數據庫的導入提供接口等。它主要包括以下4個庫:
二、OSG工具庫(NodeKit)
OSG工具庫主要是對OSG核心庫中osg庫的擴充,是對OSG核心庫的一個補充,它實現了一些特定的功能。它主要包括以下6個庫:
三、OSG插件庫
OSG插件庫是OSG的一個非常重要的特點。通過各種第三方庫的支持,OSG能夠直接或間接地導入3D模型或圖片等場景數據,可以省去大量繪制圖形的工作,從而極大地方便了開發者。具體支持的各種數據格式可參見第5章。
四、OSG內省庫(osgIntrospection)
OSG內省庫提供了一個與語言無關的運行程序接口,確保了OSG可以在更多的環境下運行。osgIntrospection庫允許軟件系統使用反射式和自省式的編程范例與OSG交互。應用程序和軟件可以使用osgIntrospection庫和方法迭代OSG的類型、枚舉量和方法,并且不需要了解OSG編譯和鏈接時的過程,即可調用這些方法。Smalltalk和Objective-C等語言包括了內建的反射式和自省式支持,但是C++的開發者通常無法運用這些特性,因為C++并未保留必要的元數(metadata)。為了彌補C++的這一不足,OSG提供了一系列自動生成的、從OSG源代碼創建的封裝庫。用戶程序不需要與OSG的封裝直接交互,它們將由osgIntrospection整體進行管理。由于osgIntrospection及其封裝的結果,許多的語言,如Java、TCL、Lua和Python,都可以與OSG進行交互。
綜上所述,OSG的組成模塊如下圖所示:
開發的預備知識:
本書《OpenSceneGraph三維渲染引擎編程指南》主要介紹實用 OSG 函數及其應用,在閱讀此書前,讀者應該有一定的 C++ 開發 經驗。OSG 是一個 C++ 的 API 庫,同時也是對 OpenGL 的底層封裝,所以讀者還需先了解 OpenGL 的渲染流程。
OSG對于標準模板庫(STL)的運用十分廣泛,因此,讀者在閱讀本書前應當對STL容器,特別是列表(list)、向量組(vector)和映射(map)有較深的理解。如果讀者對于設計模式(design patterns)也有一定的認識和理解,將對OSG的學習大有裨益,不過并非是必要的。
在學習使用OSG編程之前,讀者有必要首先熟悉3D圖形學。對于本書而言,讀者需要熟悉OpenGL編程接口,而OpenGL是標準的跨平臺底層3D圖形API函數庫。對于3D圖形學,希望讀者能夠理解對不同類型的坐標空間熟練應用笛卡兒三維坐標系來表示三維幾何數據。同時,讀者需要了解一些基本的圖形術語概念,不過并不需要對底層圖形硬件的實現有很深入的認識和理解。
讀者最好還要具備一定的線性代數知識,熟悉采用向量表示三維坐標的方法以及渲染過程中采用矩陣變換進行圖形系統的相關操作,因此,還有必要了解矩陣運算的有關知識。
OSG環境搭建
OSG的獲取比較簡單。OSG中國官網會在官方發布最新的OSG穩定版本后第一時間制作一個安裝包,該安裝包包含OSG常用的插件庫。
下載二進制版(無需CMake編譯):
下載Debug版,便于調試。下載完后的目錄結構如下:
參考這篇blog:?OpenGL-Windows Visual Studio環境配置進行配置。
其中有一步是添加.lib文件,添加如下.lib文件到依賴項:
OpenThreads.lib、osg.lib、osgDB.lib、osgFX.lib、osgGA.lib、osgManipulator.lib、osgParticle.lib、osgShadow.lib、osgSim.lib、osgTerrain.libo、osgText.lib、osgUtil.lib、osgViewer.lib
注:下載的是debug版本的話,.lib文件文件名有個后綴“d”。
自己用CMake+VS2019編譯源碼,編譯步驟在Blog:“OSG3.4.0+VS2010+WIN10編譯及二次開發環境搭建” 有詳細說明。
也可參考[這篇文章]。
下載直接可以被OSG進行讀取的資源文件。
下載解壓后,命名為“data”,然后復制到E:/…/OpenSceneGraph-3.6.5-VC2019-64-Debug目錄下,這時目錄下的文件如下圖:
設置環境變量:
OSG_FILE_PATH=E:…\OpenSceneGraph-3.6.5-VC2019-64-Debug\data
Path中添加E:…\OpenSceneGraph-3.6.5-VC2019-64-Debug\bin
復制下面這些到Debug目錄:
第一個工程
#include<osgViewer/Viewer>// L1 #include<osg/Node>// L2 #include<osg/Group>// L3 #include<osgDB/ReadFile>// L4 #include<osgDB/WriteFile>// L5 #include<osgUtil/Optimizer>// L6 int main() {// 創建Viewer對象,場景瀏覽器osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();// L9// 創建場景組節點osg::ref_ptr<osg::Group> root = new osg::Group();// L11// 創建一個節點,讀取牛的模型osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("cow.osg");// L13// 添加到場景root->addChild(node.get());// L15// 優化場景數據osgUtil::Optimizer optimizer;// L17optimizer.optimize(root.get());// L18// 設置場景數據viewer->setSceneData(root.get());// L20// 初始化并創建窗口viewer->realize();// L22// 開始渲染viewer->run();// L24return 0; }上述代碼中“cow.osg”文件放在工程根目錄下,“cow.osg”文件可在“data”目錄下可找到。這個文件有639KB。
程序運行效果如下:(全屏顯示,中間有頭“3D牛”)
程序說明:
第1行:包含場景瀏覽器osgViewer::Viewer類頭文件。
第2、3行:包含場景中基本的節點類型——節點、葉節點、組節點的頭文件。
第4、5行:包含讀取文件函數的頭文件。
第6行:包含優化場景數據的頭文件。
第9行:創建場景瀏覽器,用于渲染場景模型數據。
第11行:創建場景數據根節點,用于添加模型文件數據,構建場景樹。
第13行:從外部讀取模型文件,加載模型文件到場景。
從上面的程序可以看出,構建OSG場景渲染程序的開發步驟如下:
(1) 設置編程環境,指定頭文件。
(2) 創建場景瀏覽器,通過osgViewer::Viewer類創建一個對象,用于渲染場景。
(3) 設置場景數據,從外部加載模型或者場景數據。
(4) 設置場景數據,為渲染場景建立場景樹,確定場景數據之間的關系。
(5) 渲染,進入循環,實現場景渲染。
OSG實用工具
一、場景瀏覽器osgViewer
可以直接在cmd窗口,輸入osgviewerd cow.osg,出現上面顯示出的“3D牛”,可以鍵盤、鼠標控制牛的縮放、位置、旋轉。
注:我用的debug庫,故為osgviewerd,如果用release庫,就沒有后綴"d"了。
?命令行參數
如果要打印所有可用的命令行參數,可在控制臺窗口輸入:osgviewerd --help
?鍵盤和鼠標指令
在osgViewer運行過程中,按下h鍵即可顯示鍵盤和鼠標的操作信息,再次按下h鍵可以關閉文字顯示。也可以在控制臺窗口中顯示鍵盤和鼠標操作信息,如下表所示。
?環境變量
顯示所有可用的環境變量參數,在控制臺窗口輸入:osgviewerd --help-env
通過上面詳細的介紹,相信你已經能夠利用 osgViewer 來瀏覽場景。
二、版本信息查看器osgVersion
版本信息查看器osgVersion一般情況下很少用,因為它本身沒有很大的用途,只用于記錄當前版本的一些信息。它的使用方法同osgViewer,在打開的控制臺窗口的提示符后輸入“osgversion+相應的參數”即可使用,這里不再具體講解。
三、場景圖形壓縮歸檔工具osgArchive
osgArchive工具用于創建和讀取壓縮格式的數據,生成的壓縮文件可以在OSG程序(如osgViewer)運行時使用。
運行 osgArchive 命令行,可以得到其參數信息,如下表所示。
一如何使用osgArchive
(1)創建新的壓縮包
創建新壓縮包時,需要通過-i<filename>來指定壓縮包文件名,包括其擴展名,然后將3D文件和圖片文件以-i<filename>[<filename>…]的格式添加到壓縮包中。具體格式如下所示:
也可以使用相同的參數格式壓縮整個目錄,例如:
asgarchive -a archive.osga -i mydirectory.osga格式還支持主文件的形式,即設定添加到壓縮包的第一個文件是主文件。
(2)列出壓縮包中的文件
可以使用 -l 參數來列出指定壓縮包中所有的文件,例如:
這樣可以打印出壓縮包中包含的文件列表。
(3)從壓縮包中解壓文件
可以使用-e<filename>[<filename>…]的格式從指定壓縮包中解壓文件,例如:
二在其他OpenSceneGraph程序中使用壓縮包文件
壓縮文件可以按照普通OSG文件的形式來讀取,此時第一個解壓的文件將作為osgDB返回的結果。如果要加載壓縮包的主文件,只需要執行如下命令:
如果希望讀取壓縮包中的某個文件,則執行如下命令:
osgviewer archive.osga/glider.osg編寫代碼時,可以按照如下方式實現壓縮包的讀取:
osg::ref_ptr<osg::Node> masterNode = osgDB::readNodeFile("archive.osga"); osg::ref_ptr<osg::Node> gliderNode = osgDB::readNodeFile("archive.osga/glider.osg");三為osgdem的分頁數據生成壓縮包
osgdem程序支持生成.osga壓縮文件,只要指定-a<filename>,就可以將osgdem生成的紋理貼圖放置到一個指定的壓縮包中。
四支持壓縮的文件格式
OpenSceneGraph的壓縮包機制允許使用istream和ostream來操作壓縮包的數據流,但并不是所有的3D模型和圖片格式都支持istream和ostream操作。下面列出了目前支持壓縮包機制的幾種文件格式。
? .osg:OpenSceneGraph本地ASCII格式。
? .ive:OpenSceneGraph本地二進制格式。
? .dds:DirectDrawSurface圖片文件格式。
? .jp2:JPEG2000圖片文件格式。
雖然支持的文件格式種類不同,但是大部分格式都可以轉換為.osg或者.ive格式,從而可以使用該工具處理大部分OSG支持的文件。
四、數據轉換工具osgConv
osgConv工具用于讀取3D數據,執行基本的操作,并重新保存為新的3D數據文件。
1.使用osgConv轉換OSG本地文件格式
osgConv可用于讀取標準3D文件格式,如OpenFlight、3DS、Alias和Wavefront(OBJ)等,并將其轉換為OSG本地格式,如ASCII形式的.osg文件或者二進制形式的.ive文件。默認情況下,它將對讀入的場景圖形進行優化,轉換后的場景圖形因此會變得更加小巧,在運行時也更加快速。.ive文件格式的讀取更為快捷,它特別適用于分頁數據庫和大型數據庫文件的開發。
下面的命令用于將cow.obj轉換為.ive文件:
osgconv cow.obj cow.ive下面的命令用于將cow.obj轉換為.ive文件,同時進行壓縮并自動生成細化紋理(mipmappedtexture):
osgconv --compressed cow.obj cow.ive2.命令行參數
輸出參數操作信息的命令如下:
使用方法如下:
osgconv [option] infile1 [infile2 ...] outfile參數選項如下表所示。
到此為止,OSG的4個實用工具已經介紹完畢,希望讀者能夠熟練地使用。雖然它們只是作為工具,但是在實際的項目開發過程中是非常有實用意義的。例如,可以使用osgViewer瀏覽工程模型,并輸出統計信息,判斷是否需要優化;可以使用osgArchive來打包整個工程文件,方便文件的管理;可以使用osgConv來轉換數據,轉換成.ive格式可以加速場景渲染。在以后的學習過程中,讀者會發現它們是OSG不可缺少的一部分。
通過本章的學習,你應該對OSG有一個總體的了解,同時,也應該對OSG的設計、體系及組件有一定的了解,并熟悉OSG實用工具的使用方法。在第本章并沒有介紹編程細節,請不要急于進行編程開發。如果還沒有熟悉本章內容,可靜下心來再看一遍。
接下來的章節將從各個方面講解如何來編寫OSG程序實現常用的渲染效果。
總結
- 上一篇: PPT目录有哪些分类?
- 下一篇: 转吕建伟 我们的管理:部门管理