因為3D游戲開發課程需要,最近在看OSG(OpenSceneGraph),根據我個人的理解,它類似於GLUT,是在GL庫函數層面之上的開發接口。通過對GL庫函數的整合和優化,它提供了比GL庫函數更方便使用的功能。盡管它在很多領域都被廣泛應用,但是搭建環境的過程卻很少能在網上找到合適的教程。在經歷了1天的摸索之后,我終於大概通過一篇教程掌握了大致的方法,大致如下:
1.先到http://www.openscenegraph.org/index.php/download-section/stable-releases(如果失效了自己從首頁http://www.openscenegraph.org/里找)下載最新的OSG代碼文件
由於openscenegraph的開源性,任何人都可以參與到它的開發中來,為它添磚加瓦。所以它的源代碼都是開放的,下載下來的文件都是未編譯過的代碼文件。大家都知道,要在自己的程序中應用別人寫好的代碼要#include,但是我們下載到的是OSG源碼(為了方便開源開發,因為不同的IDE會生成不同的工程,比如Visual Studio的.sln,都用源碼是最具兼容性的方法),必須先進行編譯之后得到相應的.lib,.dll和頭文件,並在IDE中(我用的VS2013)設置好相應的路徑才行。而這個編譯過程由於源文件眾多,不熟悉源碼的人也不知道該編譯哪些,而且通過手動添加的方式過於繁瑣,所以要用到下面介紹的工具。
2.再到https://cmake.org/download/(如果失效了自己從首頁https://cmake.org/里找)下載最新的CMake(要二進制版本,能直接安裝的),這個軟件的作用就是按照指定的配置編譯指定的源文件。大家下載好的OSG代碼文件夾中會發現一個叫CMakeList的.txt文件,這里面就是按照CMake的語言寫好的配置文件。在安裝完CMake后打開它的圖形界面(我下載的版本直接點擊圖標就好)會看到如下圖界面:
現在,將上面提到的下載好的OSG的文件夾中的CMakeFile.txt拖到這個窗口中,這樣的話所有的配置都會按這個txt文件中指定的進行設置,此處唯一需要注意的是目標工程的位置,就是上圖“目標地址”的地方,默認會把它設置成與源地址相同的地方,建議改成一個獨立的文件夾。
然后點擊“Configure”按照自己的情況設置,不懂得地方基本上默認就行。然后程序就會自己為你配置生成工程所需的信息。
配置完成后,會在中間有Name和Value的窗口中看到好多的選項,紅色的地方代表新添加的需要確認的選項,這些選項對於當前的任務(能運行一個例子)來說都可以不用更改,但是推薦更改CMAKE_INSTALL_PREFIX這項。另外,如果你有添加第三方庫的需要,還需要更改ACTUAL_3RDPARTY_DIR這項。(若想添加其他功能如可執行的例子、關聯MFC、關聯Qt等請參見其他人寫的博客)
CMAKE_INSTALL_PREFIX這項說的是一會編譯出的文件放在哪里,默認是c盤,你可以在你喜歡的地方選擇一個空的文件夾,這樣稍后會省事一些。
ACTUAL_3RDPARTY_DIR這項說的是第三方庫的源文件在哪里,注意如果你下載的源文件夾是分為x86和x64兩個子文件夾的話,你只需要將此項指定到父文件夾即可。
然后繼續點擊“Configure”,直到所有紅色都消失(即確認了所有新添加的選項)后,點擊“Generate”。
點擊生成。生成之后,CMake會在第一個圖里目標地址的位置建立好你之前選擇的類型的工程,我的就是.sln,雙擊用Visual Studio打開工程,如下圖所示:
選擇Debug模式,先對ALL_BUILD進行編譯(Build),然后再對INSTALL進行編譯(Build)。然后選擇Release模式,重復同樣的工作(一定記住Debug和Release都要進行編譯,因為Debug和Release生成的文件名稱不一樣,兩個都生成一下保險一點,如果只想要一個那就優先生成Release版本的)。這樣就大功告成獲得了include文件夾,完整的lib文件夾,完整的bin文件夾。將這三個文件夾拷貝到一個獨立的位置保存好,但是這里的include還不完整,你需要把下載的OSG源文件夾中的include文件夾與當前得到的include文件夾合並,這樣就獲得了完整的OSG套裝!(但是如果你之前指定了CMAKE_INSTALL_PREFIX這項的話,在你指定的路徑里生成的include,lib,bin好像是完整的)
這三個文件夾才是OSG的完全體,之前所做的都是為了獲得這三個東西。
3.現在就可以進行編程了。新建一個c++工程,將下面的代碼進行編譯,觀察結果:
//========================================================================== //-------------------------------------------------------------------------- // Copyright (c) 2012 大氣象 All Rights Reserved. // // File : Main.cpp // Author : greatverve@gmain.com // Date : 2012-9-19 20:11 // Version : 1.0v // // Description : osg hello world. // //========================================================================== #include <osgViewer/Viewer> #include <osg/Node> #include <osg/Geode> #include <osg/Group> #include <osgDB/ReadFile> #include <osgDB/WriteFile> #include <osgUtil/Optimizer> int main() { //創建Viewer對象,場景瀏覽器 osgViewer::Viewer* viewer = new osgViewer::Viewer(); //創建場景組節點 osg::Group* root = new osg::Group(); //創建一個節點 osg::Node* node = new osg::Node(); //讀取一個模型 node = osgDB::readNodeFile("cessna.osg"); //添加到場景 root->addChild(node); //優化場景數據 osgUtil::Optimizer optimizer; optimizer.optimize(root); //設置場景數據 viewer->setSceneData(root); //初始化並創建窗口 viewer->realize(); //開始渲染 viewer->run(); return 0; }
你會發現編譯無法通過,那是因為我們沒將上面的三個文件添加到這個工程的包含目錄中。而默認的目錄中只有stdio.h,iostream等等常用的這些,所以自然無法通過。我們有兩種方法解決這個問題,一是將這三個文件夾拷貝到默認目錄下,二是將這三個文件夾所在的父文件夾的路徑添加到Visual Studio的包含目錄中。第一個不推薦,因為默認目錄下的東西太多,不方便管理。這里只對第二種方法進行演示:
右鍵這個工程,選擇屬性:
在彈出的頁面中設置include和lib文件夾的位置(bin文件夾只需要和lib文件夾在同一父目錄下即可):
然后還要添加如下附加依賴項(想詳細了解請查閱靜態鏈接庫的相關資料):
OpenThreadsd.lib
osgd.lib
osgDbd.lib
osgUtild.lib
osgGAd.lib
osgViewerd.lib
osgTextd.lib
---------------------------------------------------------------------------------------
重大發現和更新!!!
上面這些.lib的名字一定要敲對,在debug模式下必須用帶d的。比如osgd.lib不能寫成osg.lib,不然會出現各種錯誤。不知道在release模式下是不是必須用不帶d的。。。
---------------------------------------------------------------------------------------
點擊確定完成,再進行編譯,就可以運行了。但是場景中什么都沒有,但是代碼上說應該有一個模型,這是因為這個模型是從一個指定的位置讀取來的,但是在這個位置沒有這個文件。如果想正確的顯示這個場景,需要到官網的Data Resources頁面下http://www.openscenegraph.org/index.php/download-section/data下載相對應的模型文件夾。
下載完成后將其解壓拷貝到include、lib、bin文件夾所在的父文件夾下面(即與include、lib、bin並列),然后重命名為data,記住文件夾的名字一定要改成“data”!!!然后大功告成(可以在代碼中把模型的名字換成文件夾里有的其他模型看看效果)!
---------------------------------------------------------------------------------------
重大發現和更新!!!
上面這樣的做法是不對的,雖然編譯成功后運行時是可以顯示出模型的,但是如果直接點擊工程目錄下Debug文件夾下的.exe文件的話會提示找不到xxxxx.dll,這時需要添加第4步下面的第一個環境變量Path。成功后再點擊工程目錄下Debug文件夾下的.exe文件能夠運行,但是還是不會看到任何模型的。這時候需要在系統或用戶的環境變量里指定模型的目錄,即第4步下面的第二個環境變量OSG_FILE_PATH,貌似如果設置了環境變量OSG_FILE_PATH的話,模型的目錄文件夾名字叫不叫data都無所謂了,而且位置可以隨便設置在哪都行。然后再點擊工程目錄下Debug文件夾下的.exe文件能夠運行且模型正確顯示。
但是問題是為什么Debug下編譯之后運行可以看到效果,但是直接點擊exe卻看不到呢?具體的原因我目前也不清楚。
---------------------------------------------------------------------------------------
4.最后,對於那些想用cmd命令行調用osgviewer等程序的同學,你需要在windows環境變量中添加如下項:
第一個是osgviewer的位置,即在用戶變量(系統變量貌似也可以)Path項(如果沒有就找找PATH或path)中添加你的bin文件夾的路徑,例如D:\OSG\bin;(分號也要帶着)
第二個是模型數據data的位置,即在用戶變量(系統變量貌似也可以)中添加一項OSG_FILE_PATH並添加你的data文件夾的路徑,例如D:\OSG\data;(分號也要帶着)
這樣就完成了。試一試在命令行中敲osgviewer空格cow.osg然后回車,osgviewer會自動加載cow.osg這個模型,和上面的那個程序調試運行是一個效果。
(!如果提示沒有osgviewer這個指令,試試換成osgviewerd cow.osg,如果能用就說明你只生成了debug版的文件而沒有生成release版的!)