前言
Osg深入之後需要打開模型文件,這些模型文件是已有的模型文件,加載入osg之後可以在常見中展示模型文件,該節點可以操作,多個逼真的模型的節點就實現了基本的場景構建。
三維模型文件一般是由專業的三維建模人員完成,可以去buy通用模型,但是定製模型的費用就相對不便宜了,幾十幾百幾千幾萬的都有,三維項目一定要了解清楚前期建模,也有很多是由甲方自行提供,因爲只有甲方纔能知道模型效果是什麼樣。
osg、osgEarth所有文件都是通過osgDB庫來讀取,通過Registry來查找文件拓展名對應的osg庫,根據一定規則拼接成完成的osg庫名並加載,通過ReaderWriter對象來完成節點的讀取(ReaderWriter是讀寫節點的基類,可通過派生此類重寫讀寫方法實現自己的讀寫格式)。
然後,查看我們的osg庫名稱:
發現支持的格式還真不少,然後我們進行大致歸類:
3DC文件是三維建模軟件3DCrafter建的三維場景,用於存儲和加載3D模型和場景。3DC文件包括場景的幾何形狀、形狀、材質和燈光效果,用於創建3 圖像和動畫。
3DS(3D Studio)文件是一種用於 3D 圖形模型的文件格式,它是 Autodesk 3ds Max 軟件的主要文件格式之一。是一種常見的 3D 模型文件格式,用於存儲和傳輸 3D 對象、材質、動畫和變形等數據。可以被許多 3D 圖形軟件讀取和編輯。它廣泛應用於遊戲開發、動畫製作、虛擬現實等領域。
BVH文件包含角色的骨骼和肢體關節旋轉數據。BVH 是一種通用的人體特徵動畫文件格式,,廣泛地被當今流行的各種動畫製作軟件支持。通常可從記錄人類行爲運動的運動捕獲硬件獲得。
OpenSceneGraph 二進制三維文件。
由LightWave 3D創建的三維對象文件,該程序用於三維建模、動畫和渲染;包含描述對象形狀和外觀的點、多邊形和曲面;還可以包含對用於對象紋理的圖像文件的引用。
LightWave 3D Scene File 文件是最常用的文件類型,帶有 LWS 文件擴展名,最初由 NewTek開發LightWave 3D。
當前這種OSC格式是一種GIS地理信息文件,是由OpenStreetMap研發,作爲一種 OpenStreetMap更改文件使用,此文件流行程度是 50 分(0-100滿分)。
OSG場景數據格式,可以記錄場景書結構的所有節點及其屬性信息。它屬於文本文件類型,不需要專門的編輯器。osgb是osg的二進制格式,osgb是傾斜攝影的格式,osg可以直接讀取osgb文件。
osgArchive 數據歸檔器 爲衆多 OSG 文件以及 IVE 文件打包提供了一個工具 它所生成的 OSGA 文件是整個文件,可以爲海量數據的存放提供良好的支持
MD2是Quake2中使用的模型文件格式,由於其比較簡單,容易實現,所以應用很廣,是一種經典的動畫模型格式。該文件格式由2部分組成:一部分是文件頭,包含了文件ID號、版本號和有關模型的各種數據的起始地址等;另一部分是文件的主體,包含了有關模型的各種數據,如頂點數據、紋理數據、法向量數據等。
obj可以指一種3D模型格式的文件,也可以指一種程序編譯中間代碼文件。obj3D模型文件是一種文本文件,可以直接用寫字板打開進行查看和編輯修改,裏面不包含動畫、材質特性、貼圖路徑、動力學、粒子等信息,但是可包含紋理信息,而對紋理進行輕量化壓縮可以減小文件大小和提高加載性能。。obj目標文件一般是程序編譯後的二進制文件,再通過鏈接器和資源文件鏈接就成可執行文件了。
FLY (OpenFlight) 格式(通常使用 .flt 文件擴展名)是一種用於表示三維場景和模型的文件格式。OpenFlight 最初由Multigen-Paradigm公司開發,用於航空模擬和虛擬環境的創建。後來,這個格式被移交給了Presagis公司繼續開發和維護。
shp是“空間數據開放”格式的文件。shp全稱“ESRI Shapefile”,是美國環境系統研究所公司開發的一種空間數據開放格式,是一種矢量圖形格式,該格式文件主要用於描述幾何體對象(點,折線與多邊形),能夠保存幾何圖形的位置及相關屬性。
3d打印一般用stl格式的3d文件,3d打印機識別STL格式的文件
DXF(Drawing Exchange Format)是一種用於圖形交換的文件格式,由AutoDesk公司開發。DXF文件可以包含2D或3D圖形數據,可以被多個CAD程序所支持。
BMP是英文Bitmap(位圖)的簡寫,它是Windows操作系統中的標準圖像文件格式,能夠被多種Windows應用程序所支持。
DDS是一種圖片格式,是DirectDraw Surface的縮寫,它是DirectX紋理壓縮(DirectX Texture Compression,簡稱DXTC)的產物。由NVIDIA公司開發。大部分3D遊戲引擎都可以使用DDS格式的圖片用作貼圖,也可以製作法線貼圖。通過安裝DDS插件後可以在
JPEG格式是最常用的圖像文件格式,後綴名爲.jpg或.jpeg。
tga是由美國Truevision公司爲其顯示卡開發的一種圖像文件格式,
pic是一種圖像文件格式,以圖像文件格式是記錄和存儲影像信息的格式。對數字圖像進行存儲、處理、傳播,必須採用一定的圖像格式,也就是把圖像的像素按照一定的方式進行組織和存儲,把圖像數據存儲成文件就得到圖像文件。
.rgb文件是SGI圖像文件格式的24位RGB彩色位圖圖像文件。
PNG,全稱Portable Network Graphics,是一種無損壓縮的圖像文件格式,廣泛應用於互聯網上的圖像文件。
PNM(Portable Any Map)格式是一系列用於便攜式圖像的圖像文件格式,這些圖像是像素值的映射,可以表示灰度或彩色數據。
DOT文件擴展名信息一種Microsoft Word文檔模板。
DW格式文件是Dreamweaver的特有文件,它通常包括HTML代碼和網頁相關的資源(如圖像、Flash、JavaScript、CSS等)。
KTX(Khronos Texture)是一個輕量級的紋理容器,用於OpenGL®、Vulkan®和其他GPU API。KTX文件包含紋理加載所需的所有參數。
lua是一個簡潔、輕量、可擴展的腳本語言,該語言的設計目的是爲了嵌入應用程序中,從而爲應用程序提供靈活的擴展和定製功能。
MDL文件是一個文件包,裏面包含模型,貼圖,所有動作,以及腳本。
osgjs是osjjs框架支持的格式,其實是json格式的文本類型。 要把自己建的模型轉換成這個格式,首先要將3ds格式轉換爲osg格式,然後再osg中轉成json格式。
panda3D打包系統中的完整文件;用於打包應用程序以供分發;類似於.MF 文件,但專門用於保存Panda3D應用程序而不是其他項;保存運行應用程序所需的所有內容,包括:Python代碼、模型、紋理和已編譯的.DLL 文件。
PLY是一種電腦檔案格式,全名爲多邊形檔案(Polygon File Format)或斯坦福三角形檔案(Stanford Triangle Format)。
POV 文件擴展是POV-Ray Raytracing Format爲 Pov-Ray 軟件程序開發的 The POV-Team文件類型。
PVR文件擴展名來自POWERVR Texture File。該文件的開發由Imagination Technologies完成。該文件屬於二進制格式,是光柵相關文件。
rot文件擴展是Homeworld 2 Graphics File 文件,最初由Sierra Entertainment 爲 Homeworld 2開發。 Annoymous用戶數據統計推斷,ROT 文件在China和使用Windows 10 設備的用戶中最受歡迎。 這些用戶中的大多數正在運行Google Chrome web瀏覽器。
該格式是一種類似DOC格式的文件格式。tf是通常所說的富文本格式,也叫作多文本格式,常用來存儲文檔、圖片信息。在不同的操作系統下創建的tf格式文檔可以在其它操作系統和應用軟件之間互相查看、傳輸,十分的方便。
TXF是一種字體文件格式,用於保存稅務數據,如收入和支出標準的基於文本的格式。它可以用於勒斯蒂亞、宇宙模擬和可視化程序的字體文件,也可以用於語言翻譯和本地化程序創建的翻譯文件。
TXP是編輯瀏覽格式,最簡單的例子,把網絡上的小說儲存到移動設備上(比如手機、MP4等等),有些情況就要將原文轉換成.TXP
VTF(Valve Textures File)Valve貼圖文件,是由VALVE獨創的圖象格式,由TGA格式演變而來,其優點是能很好的體現和展示TGA所具有的通道效果。
這是DirectX一種專用格式.。
自定義文件插件主要是自定義一個插件讀寫類,繼承osgDB::ReaderWriter類,然後根據需求重寫如readNode等函數方法即可。
在建立插件讀寫類時注意:
需要建立一個dll項目工程,輸出的dll必須爲osgdb_擴展名.dll或osgdb_擴展名d.dll的形式爲了實現插件註冊,需要定義全局變量,方法如下REGISTER_OSGPLUGIN(VR, ReaderWriterVR),在該全局變量的初始化過程中,會使用Registery::addReaderWriter函數自動註冊插件所對應的擴展名。
在應用程序使用中,需要註冊插件,方法如下 osgDB::Registry::instance->addFileExtensionAlias(“VR”, “VR”)
其實我們不是做引擎沒必要做插件,還是直接轉換三維模型文件格式好一些。
選擇obj格式最合適,但是又不帶紋理等貼圖格式,還需要配上貼圖格式。
加載了obj文件,沒有紋理,打開obj,發現需要一個mtllib的xxx.mtl作爲紋理文件,拿到的模型是沒有的。
mtllib:此前綴後指定了此OBJ文件所使用的材質庫文件(*.mtl)的文件路徑
加載了3ds文件,確實顯示出來了,效果還不錯,測試了拽託縮放完美流暢效果不錯,達到預期。
osg::ref_ptr<osg::Node> OsgWidget::getModel3DMaxFile()
{
// 隱藏整個demo全局的按鈕面板
ui->groupBox_pannel->setVisible(false);
ui->label_cursor->setVisible(false);
ui->label_cursor_2->setVisible(false);
ui->label_msg->setVisible(false);
ui->label_state->setVisible(false);
// 正式開始
osg::ref_ptr<osg::Group> pGroup = new osg::Group;
osg::ref_ptr<osg::Camera> pCamera = 0;
osg::ref_ptr<osg::Geode> pGeode = 0;
osg::ref_ptr<osg::Node> pNode = 0;
// 添加模型
{
// osgDB::Options* a = new osgDB::Options(std::string("noTriStripPolygons"));
// osg::ref_ptr<osg::Node> node1 = osgDB::readNodeFile("D:/qtProject/osgDemo/modelData/grass.obj", a);
// osg::ref_ptr<osg::Node> node1 = osgDB::readNodeFile("D:/qtProject/osgDemo/modelData/grass.obj");
pNode = osgDB::readNodeFile("D:/qtProject/osgDemo/modelData/grass.3ds");
}
// 創建背景相機(相機需要配合幾何題圖,可以理解爲相機是最後得,相機中有一個全屏的圖,這個圖是個元素節點,這樣圖節點在相機中就成爲了背景圖)
{
// 步驟一:創建相機
pCamera = new osg::Camera();
// 步驟二:設置矩陣 顯示得界面邊座標 左 右 下 上
pCamera->setProjectionMatrixAsOrtho2D(0, 1920, 0, 1080);
// 步驟三:設置視圖矩陣
pCamera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
// 步驟四:不受父類矩陣影響
pCamera->setViewMatrix(osg::Matrix::identity());
// 步驟五:清除深度緩存
pCamera->setClearMask(GL_DEPTH_BUFFER_BIT);
// 步驟六:設置爲不接受事件,讓其得不到焦點
pCamera->setAllowEventFocus(false);
// 步驟七:設置渲染順序
// pCamera->setRenderOrder(osg::Camera::PRE_RENDER); // 不顯示了
pCamera->setRenderOrder(osg::Camera::NESTED_RENDER); // 顯示爲背景HUD
// pCamera->setRenderOrder(osg::Camera::POST_RENDER); // 顯示爲前景HUD
// 步驟八:關閉光照,通過osg::StateSet設置
pGeode = new osg::Geode();
osg::ref_ptr<osg::StateSet> pStateSet = pGeode->getOrCreateStateSet();
pStateSet->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
// 步驟九:關閉深度測試
pStateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);
}
// 創建鋪滿窗口的方形(窗口形狀),並貼背景紋理圖
{
// 步驟一:創建幾何信息對象
osg::ref_ptr<osg::Geometry> pGeometry = new osg::Geometry;
// 步驟二:綁定頂點
osg::ref_ptr<osg::Vec3Array> pVec3Array = new osg::Vec3Array;
pGeometry->setVertexArray(pVec3Array);
#if 0
pVec3Array->push_back(osg::Vec3( 300.0, 100.0, 0.0));
pVec3Array->push_back(osg::Vec3( 600.0