OSG開發筆記(二十九):OSG加載模型文件、加載3DMax三維型文件Demo

前言

  Osg深入之後需要打開模型文件,這些模型文件是已有的模型文件,加載入osg之後可以在常見中展示模型文件,該節點可以操作,多個逼真的模型的節點就實現了基本的場景構建。

 

Demo

  請添加圖片描述

 

說明

  三維模型文件一般是由專業的三維建模人員完成,可以去buy通用模型,但是定製模型的費用就相對不便宜了,幾十幾百幾千幾萬的都有,三維項目一定要了解清楚前期建模,也有很多是由甲方自行提供,因爲只有甲方纔能知道模型效果是什麼樣。

 

Osg讀取文件庫:OsgDB庫

  osg、osgEarth所有文件都是通過osgDB庫來讀取,通過Registry來查找文件拓展名對應的osg庫,根據一定規則拼接成完成的osg庫名並加載,通過ReaderWriter對象來完成節點的讀取(ReaderWriter是讀寫節點的基類,可通過派生此類重寫讀寫方法實現自己的讀寫格式)。
  在這裏插入圖片描述

  然後,查看我們的osg庫名稱:
  在這裏插入圖片描述

  發現支持的格式還真不少,然後我們進行大致歸類:

三維格式

.3dc

  3DC文件是三維建模軟件3DCrafter建的三維場景,用於存儲和加載3D模型和場景。3DC文件包括場景的幾何形狀、形狀、材質和燈光效果,用於創建3 圖像和動畫。

.3ds

  3DS(3D Studio)文件是一種用於 3D 圖形模型的文件格式,它是 Autodesk 3ds Max 軟件的主要文件格式之一。是一種常見的 3D 模型文件格式,用於存儲和傳輸 3D 對象、材質、動畫和變形等數據。可以被許多 3D 圖形軟件讀取和編輯。它廣泛應用於遊戲開發、動畫製作、虛擬現實等領域。

.bvh

  BVH文件包含角色的骨骼和肢體關節旋轉數據。BVH 是一種通用的人體特徵動畫文件格式,,廣泛地被當今流行的各種動畫製作軟件支持。通常可從記錄人類行爲運動的運動捕獲硬件獲得。

.Ive

  OpenSceneGraph 二進制三維文件。

.lwo

  由LightWave 3D創建的三維對象文件,該程序用於三維建模、動畫和渲染;包含描述對象形狀和外觀的點、多邊形和曲面;還可以包含對用於對象紋理的圖像文件的引用。

.lws

  LightWave 3D Scene File 文件是最常用的文件類型,帶有 LWS 文件擴展名,最初由 NewTek開發LightWave 3D。

.osc

  當前這種OSC格式是一種GIS地理信息文件,是由OpenStreetMap研發,作爲一種 OpenStreetMap更改文件使用,此文件流行程度是 50 分(0-100滿分)。

.osg(osgb)

  OSG場景數據格式,可以記錄場景書結構的所有節點及其屬性信息。它屬於文本文件類型,不需要專門的編輯器。osgb是osg的二進制格式,osgb是傾斜攝影的格式,osg可以直接讀取osgb文件。

.osga

  osgArchive 數據歸檔器 爲衆多 OSG 文件以及 IVE 文件打包提供了一個工具 它所生成的 OSGA 文件是整個文件,可以爲海量數據的存放提供良好的支持

.md2

  MD2是Quake2中使用的模型文件格式,由於其比較簡單,容易實現,所以應用很廣,是一種經典的動畫模型格式。該文件格式由2部分組成:一部分是文件頭,包含了文件ID號、版本號和有關模型的各種數據的起始地址等;另一部分是文件的主體,包含了有關模型的各種數據,如頂點數據、紋理數據、法向量數據等。

.obj

  obj可以指一種3D模型格式的文件,也可以指一種程序編譯中間代碼文件。obj3D模型文件是一種文本文件,可以直接用寫字板打開進行查看和編輯修改,裏面不包含動畫、材質特性、貼圖路徑、動力學、粒子等信息,但是可包含紋理信息,而對紋理進行輕量化壓縮可以減小文件大小和提高加載性能。。obj目標文件一般是程序編譯後的二進制文件,再通過鏈接器和資源文件鏈接就成可執行文件了。

.openflight(FLT)

  FLY (OpenFlight) 格式(通常使用 .flt 文件擴展名)是一種用於表示三維場景和模型的文件格式。OpenFlight 最初由Multigen-Paradigm公司開發,用於航空模擬和虛擬環境的創建。後來,這個格式被移交給了Presagis公司繼續開發和維護。

.shp

  shp是“空間數據開放”格式的文件。shp全稱“ESRI Shapefile”,是美國環境系統研究所公司開發的一種空間數據開放格式,是一種矢量圖形格式,該格式文件主要用於描述幾何體對象(點,折線與多邊形),能夠保存幾何圖形的位置及相關屬性。

.stl

  3d打印一般用stl格式的3d文件,3d打印機識別STL格式的文件

dxf

  DXF(Drawing Exchange Format)是一種用於圖形交換的文件格式,由AutoDesk公司開發。DXF文件可以包含2D或3D圖形數據,可以被多個CAD程序所支持。

圖像格式

.bmp

  BMP是英文Bitmap(位圖)的簡寫,它是Windows操作系統中的標準圖像文件格式,能夠被多種Windows應用程序所支持。

.dds

  DDS是一種圖片格式,是DirectDraw Surface的縮寫,它是DirectX紋理壓縮(DirectX Texture Compression,簡稱DXTC)的產物。由NVIDIA公司開發。大部分3D遊戲引擎都可以使用DDS格式的圖片用作貼圖,也可以製作法線貼圖。通過安裝DDS插件後可以在

.jpeg

  JPEG格式是最常用的圖像文件格式,後綴名爲.jpg或.jpeg。

.tga

  tga是由美國Truevision公司爲其顯示卡開發的一種圖像文件格式,

.pic

  pic是一種圖像文件格式,以圖像文件格式是記錄和存儲影像信息的格式。對數字圖像進行存儲、處理、傳播,必須採用一定的圖像格式,也就是把圖像的像素按照一定的方式進行組織和存儲,把圖像數據存儲成文件就得到圖像文件。

.rgb

  .rgb文件是SGI圖像文件格式的24位RGB彩色位圖圖像文件。

.png

  PNG,全稱Portable Network Graphics,是一種無損壓縮的圖像文件格式,廣泛應用於互聯網上的圖像文件。

.pnm

  PNM(Portable Any Map)格式是一系列用於便攜式圖像的圖像文件格式,這些圖像是像素值的映射,可以表示灰度或彩色數據。

其他

.dot

  DOT文件擴展名信息一種Microsoft Word文檔模板。

.dw

  DW格式文件是Dreamweaver的特有文件,它通常包括HTML代碼和網頁相關的資源(如圖像、Flash、JavaScript、CSS等)。

.ktx

  KTX(Khronos Texture)是一個輕量級的紋理容器,用於OpenGL®、Vulkan®和其他GPU API。KTX文件包含紋理加載所需的所有參數。

.lua

  lua是一個簡潔、輕量、可擴展的腳本語言,該語言的設計目的是爲了嵌入應用程序中,從而爲應用程序提供靈活的擴展和定製功能。

.mdl

  MDL文件是一個文件包,裏面包含模型,貼圖,所有動作,以及腳本。

.osgjs

  osgjs是osjjs框架支持的格式,其實是json格式的文本類型。 要把自己建的模型轉換成這個格式,首先要將3ds格式轉換爲osg格式,然後再osg中轉成json格式。

.p3d

  panda3D打包系統中的完整文件;用於打包應用程序以供分發;類似於.MF 文件,但專門用於保存Panda3D應用程序而不是其他項;保存運行應用程序所需的所有內容,包括:Python代碼、模型、紋理和已編譯的.DLL 文件。

.ply

  PLY是一種電腦檔案格式,全名爲多邊形檔案(Polygon File Format)或斯坦福三角形檔案(Stanford Triangle Format)。

.pov

  POV 文件擴展是POV-Ray Raytracing Format爲 Pov-Ray 軟件程序開發的 The POV-Team文件類型。

.pvr

  PVR文件擴展名來自POWERVR Texture File。該文件的開發由Imagination Technologies完成。該文件屬於二進制格式,是光柵相關文件。

.rot

  rot文件擴展是Homeworld 2 Graphics File 文件,最初由Sierra Entertainment 爲 Homeworld 2開發。 Annoymous用戶數據統計推斷,ROT 文件在China和使用Windows 10 設備的用戶中最受歡迎。 這些用戶中的大多數正在運行Google Chrome web瀏覽器。

.tf

  該格式是一種類似DOC格式的文件格式。tf是通常所說的富文本格式,也叫作多文本格式,常用來存儲文檔、圖片信息。在不同的操作系統下創建的tf格式文檔可以在其它操作系統和應用軟件之間互相查看、傳輸,十分的方便。

.txf

  TXF是一種字體文件格式,用於保存稅務數據,如收入和支出標準的基於文本的格式。它可以用於勒斯蒂亞、宇宙模擬和可視化程序的字體文件,也可以用於語言翻譯和本地化程序創建的翻譯文件。

.txp

  TXP是編輯瀏覽格式,最簡單的例子,把網絡上的小說儲存到移動設備上(比如手機、MP4等等),有些情況就要將原文轉換成.TXP

.vtf

  VTF(Valve Textures File)Valve貼圖文件,是由VALVE獨創的圖象格式,由TGA格式演變而來,其優點是能很好的體現和展示TGA所具有的通道效果。

.x

  這是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文件,沒有紋理,打開obj,發現需要一個mtllib的xxx.mtl作爲紋理文件,拿到的模型是沒有的。
  在這裏插入圖片描述

  mtllib:此前綴後指定了此OBJ文件所使用的材質庫文件(*.mtl)的文件路徑

步驟二:加載3ds文件

  加載了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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章