OSG 開発ノート (29): OSG のモデル ファイルのロード、3DMax 3 次元ファイルのロード デモ


この記事がオリジナル記事である場合、許可なく転載することはできません
この記事のブログ アドレス: https://blog.csdn.net/qq21497936/article/details/134064988
読者の皆様、知識は無限ですが、人材には限りがあります。ニーズを変えるか、専門家を見つけ、または、自分で調べてください

Red Fatty (Red Imitation) のブログ集: 開発技術集 (Qt 実践技術、Raspberry Pi、3D、OpenCV、OpenGL、ffmpeg、OSG、マイコン、ソフトウェアとハ​​ードウェアの組み合わせなどを含む) を継続的に更新中...

OSG開発コラム(ポータルをクリック)

前の記事: 「OSG 開発ノート (28): OSG モデルの固定パス アニメーション
次の記事: 継続的に追加中...



序文

  したがって、OSG は綿密な調査後にモデル ファイルを開く必要があります。これらのモデル ファイルは既存のモデル ファイルです。OSG にロードした後、モデル ファイルは共通に表示されます。このノードは操作可能です。複数のリアルなモデル ノードが基本的なシーン構築を実現します。 。


デモ

  画像の説明を追加してください


説明する

  3D モデル ファイルは通常、プロの 3D モデラーによって完成されます。一般的なモデルは購入できますが、カスタマイズされたモデルのコストは数十、数百、数万と比較的高価です。初期段階で 3D プロジェクトを明確に理解する必要があります。モデルがどのように見えるかを知ることができるのは当事者 A だけであるため、モデリングの部分は当事者 A 自身によって提供されます。


Osg はファイル ライブラリを読み取ります: OsgDB ライブラリ

  osg と osgEarth のすべてのファイルは、osgDB ライブラリを通じて読み取られます。ファイル拡張子名に対応する osg ライブラリは、レジストリを通じて見つかります。完成した osg ライブラリ名は、特定のルールに従って完成した osg ライブラリ名に結合され、ロードされます。ノードの読み取りは、ReaderWriter オブジェクトを通じて完了します (ReaderWriter は、読み取りおよび書き込みノードの基本クラスです。このタイプのオーバーライド読み取りおよび書き込みメソッドを派生することで、独自の読み取りおよび書き込み形式を実装できます)。
  ここに画像の説明を挿入します

  次に、osg ライブラリ名を見てください。
  ここに画像の説明を挿入します

  サポートされている形式がかなりの数あることが判明したので、それらを大まかに分類します。

3Dフォーマット

.3dc

  3DC ファイルは、3D モデリング ソフトウェア 3DCrafter によって作成された 3D シーンであり、3D モデルとシーンの保存と読み込みに使用されます。 3DC ファイルには、シーンのジオメトリ、形状、マテリアル、照明効果が含まれており、3 つの画像とアニメーションの作成に使用されます。

.3ds

  3DS(3D Studio)ファイルは、3D グラフィックス モデルに使用されるファイル形式で、Autodesk 3ds Max ソフトウェアの主要なファイル形式の 1 つです。これは、3D オブジェクト、マテリアル、アニメーション、変形などのデータの保存と転送に使用される一般的な 3D モデル ファイル形式です。多くの 3D グラフィック ソフトウェアで読み取りおよび編集できます。ゲーム開発、アニメーション制作、仮想現実などの分野で広く使用されています。

.bvh

  BVH ファイルには、キャラクターのスケルトンと手足の関節の回転データが含まれています。 BVH は、汎用の人体フィーチャー アニメーション ファイル形式であり、現在さまざまな人気のあるアニメーション制作ソフトウェアで広くサポートされています。通常、人間の動作を記録するモーション キャプチャ ハードウェアから利用できます。

.Ive

  OpenSceneGraph バイナリ 3D ファイル。

.lwo

  3 次元モデリング、アニメーション、レンダリングに使用されるプログラムである LightWave 3D によって作成された 3 次元オブジェクト ファイル。オブジェクトの形状と外観を記述する点、ポリゴン、およびサーフェスが含まれます。オブジェクトに使用される画像ファイルへの参照も含まれる場合があります。テクスチャ。

  LightWave 3D シーン ファイル ファイルは、LWS ファイル拡張子を持つ最も一般的に使用されるファイル タイプで、元々は NewTek LightWave 3D によって開発されました。

.osc

  現在の OSC 形式は、OpenStreetMap によって開発され、OpenStreetMap 変更ファイルとして使用される GIS 地理情報ファイルであり、このファイルの人気度は 50 ポイント (0-100 点満点) です。

.osg(osgb)

  OSG シーン データ形式では、シーン ブック構造内のすべてのノードとその属性情報を記録できます。テキストファイル形式なので特別なエディタは必要ありません。 osgbは斜景撮影フォーマットであるosgのバイナリフォーマットで、osgファイルを直接読み込むことができます。

。下がる

  osgArchive データ アーカイバは、多くの OSG ファイルと IVE ファイルをパッケージ化するためのツールを提供します。生成される OSGA ファイルはファイル全体であり、大規模なデータのストレージを適切にサポートします。

.md2

  MD2 は Quake2 で使用されるモデル ファイル形式で、比較的シンプルで実装が容易であるため、広く使用されており、古典的なアニメーション モデル形式です。ファイル形式は 2 つの部分で構成されます: 1 つの部分はファイル ID 番号、バージョン番号、モデルに関連するさまざまなデータの開始アドレスを含むファイル ヘッダー、もう 1 つの部分はファイルの本体であり、さまざまなデータが含まれます。頂点データ、テクスチャデータ、法線ベクトルデータなど、モデルに関連するデータ。

.obj

  Obj は、3D モデル形式のファイルまたはプログラムのコンパイル中間コード ファイルを参照できます。 obj3D モデル ファイルは、ワードパッドで直接開いて表示、編集、変更できるテキスト ファイルです。アニメーション、マテリアル プロパティ、テクスチャ パス、ダイナミクス、パーティクルなどの情報は含まれていませんが、テクスチャ情報を含めることはできます。定量的な圧縮により、ファイル サイズが削減され、読み込みパフォーマンスが向上します。 。 obj オブジェクト ファイルは通常、プログラムによってコンパイルされたバイナリ ファイルで、リンカーとリソース ファイルを通じてリンクされて実行可能ファイルになります。

.openflight(FLT)

  FLY (OpenFlight) 形式 (通常は .flt ファイル拡張子が使用されます) は、3 次元のシーンとモデルを表すために使用されるファイル形式です。 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 は English Bitmap の略で、Windows オペレーティング システムの標準画像ファイル形式であり、さまざまな Windows アプリケーションでサポートされています。

.dds

  DDS は、DirectX Texture Compression (DXTC) の製品である DirectDraw Surface の略称である画像フォーマットです。 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 ファイル拡張子情報は Microsoft Word の文書テンプレートです。

.dw

  DW 形式ファイルは Dreamweaver 独自のファイルで、通常、HTML コードと Web ページ関連のリソース (画像、Flash、JavaScript、CSS など) が含まれています。

.ktx

  KTX (Khronos Texture) は、OpenGL®、Vulkan®、およびその他の GPU API 用の軽量テクスチャ コンテナです。 KTX ファイルには、テクスチャのロードに必要なすべてのパラメータが含まれています。

。二

  Lua は、簡潔かつ軽量で拡張可能なスクリプト言語であり、アプリケーションに柔軟な拡張機能やカスタマイズ機能を提供するためにアプリケーションに組み込むように設計されています。

.mdl

  MDL ファイルは、モデル、テクスチャ、すべてのアクション、スクリプトが含まれるファイル パッケージです。

.osgjs

  osgjs は osjjs フレームワークでサポートされている形式で、実際には json 形式のテキスト型です。構築したモデルをこの形式に変換するには、まず 3ds 形式を osg 形式に変換し、次に osg で json 形式に変換する必要があります。

.p3d

  panda3D パッケージング システム内の完全なファイル。配布用にアプリケーションをパッケージ化するために使用されます。.MF ファイルに似ていますが、特に Panda3D アプリケーションを保存するために使用され、他の項目は含まれません。Python コード、モデル、テクスチャ、およびコンパイルされた .DLL ファイル。

。プライ

  PLY はコンピューター ファイル形式で、正式名は Polygon File Format または Stanford Triangle Format です。

。 投げる

  POV ファイル拡張子は、Pov-Ray ソフトウェア プログラム用に The POV-Team ファイル タイプによって開発された POV-Ray レイトレーシング形式です。

.pvr

  PVR ファイルの拡張子は POWERVR Texture File に由来しています。このドキュメントの開発は Imagination Technologies によって完了しました。このファイルはバイナリ形式に属し、ラスター関連のファイルです。

。腐敗

  ^rot ファイル拡張子は、もともと Sierra Entertainment によって Homeworld 2 用に開発された Homeworld 2 Graphics File ファイルです。迷惑ユーザー データの統計によると、中国で Windows 10 デバイスを使用しているユーザーの間で ROT ファイルが最も人気があることが推測されます。これらのユーザーのほとんどは Google Chrome Web ブラウザを実行しています。

.tf

  この形式はDOC形式に似たファイル形式です。 tf は一般にリッチ テキスト形式として知られており、マルチテキスト形式とも呼ばれ、ドキュメントや画像情報を保存するためによく使用されます。異なるOSで作成したTF形式の文書を他のOSやアプリケーションソフト間で閲覧したり転送したりすることができ、大変便利です。

.txf

  TXF は、収入や支出などの税データを標準のテキストベース形式で保存するために使用されるフォント ファイル形式です。 Lustia、ユニバース シミュレーションおよび視覚化プログラムのフォント ファイル、および言語翻訳およびローカリゼーション プログラムによって作成された翻訳ファイルで使用できます。

.txp

  TXP は編集および閲覧用の形式です。最も単純な例は、インターネット上の小説をモバイル デバイス (携帯電話、MP4 など) に保存することです。場合によっては、原文を .TXP に変換する必要があります。

.vtf

  VTF (Valve Textures File) バルブ テクスチャ ファイルは、TGA フォーマットを発展させて VALVE が独自に作成した画像フォーマットであり、TGA のチャンネル効果をよく反映して表示できるのが利点です。

。バツ

  DirectX の独自形式です。


カスタムファイルプラグイン

  カスタム ファイル プラグインは、主にプラグインの読み書きクラスをカスタマイズし、osgDB::ReaderWriter クラスを継承し、必要に応じて readNode などの関数やメソッドを書き換えます。
  プラグインの読み取りおよび書き込みクラスを確立するときは、次の点に注意してください。
  dll プロジェクトを作成する必要があり、出力 dll は osgdb_extension.dll またはosgdb_extension. d.dll の形式でプラグインの登録を実装するには、グローバル変数を定義する必要があります。メソッドは次のとおりです REGISTER_OSGPLUGIN(VR, ReaderWriterVR). グローバル変数の初期化プロセス中に、レジストリは次のようになります: :addReaderWriter関数を使用して、プラグインに対応する拡張子を自動登録します。
  アプリケーションを利用する際にはプラグインの登録が必要ですが、その方法は以下のとおりです osgDB::Registry::instance->addFileExtensionAlias(“VR”, “VR”)
   実際には、エンジンを作成するためにプラグインを作成する必要はなく、3D モデルのファイル形式を直接変換する方が良いでしょう。


モデルファイルのロードをテストする

  obj 形式が最適ですが、テクスチャ形式などのテクスチャ形式が付属していないため、テクスチャ形式と組み合わせる必要もあります。
  ここに画像の説明を挿入します

ステップ 1: obj をロードする

  obj ファイルは読み込まれたのですが、テクスチャがありませんでした、obj を開くと、テクスチャ ファイルとして mtllib の xxx.mtl が必要であることが分かりましたが、入手したモデルにはそれがありませんでした。
  ここに画像の説明を挿入します

  mtllib: この接頭辞は、この OBJ ファイルが使用するマテリアル ライブラリ ファイル (*.mtl) のファイル パスを指定します。

ステップ 2: 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, 100.0, 0.0));
        pVec3Array->push_back(osg::Vec3( 600.0, 200.0, 0.0));
        pVec3Array->push_back(osg::Vec3( 300.0, 200.0, 0.0));
#else
        pVec3Array->push_back(osg::Vec3(   0,    0, 0));
        pVec3Array->push_back(osg::Vec3(1920,    0, 0));
        pVec3Array->push_back(osg::Vec3(1920, 1080, 0));
        pVec3Array->push_back(osg::Vec3(   0, 1080, 0));
#endif
        // 步骤三:读取图片(用于贴纹理)
        osg::ref_ptr<osg::Image> pImage = new osg::Image;
        pImage = osgDB::readImageFile(QString("D:/qtProject/osgDemo/osgDemo/modules/osgWidget/image/background2.png").toStdString());
        if(!pImage->valid())
        {
    
    
            LOG_WARN(QString("Failed to open image file: %1").arg(QString::fromStdString(pImage->getFileName())));
            return 0;

        }
        // 步骤四:创建纹理
        osg::ref_ptr<osg::Texture2D> pTexture2D = new osg::Texture2D();
        pTexture2D->setImage(pImage);
        pTexture2D->setUnRefImageDataAfterApply(true);
        // 步骤五:绑定纹理映射顶点
        osg::ref_ptr<osg::Vec2Array> pVec2Array = new osg::Vec2Array();
        pGeometry->setTexCoordArray(0, pVec2Array.get());
        pVec2Array->push_back(osg::Vec2(0.0, 0.0));
        pVec2Array->push_back(osg::Vec2(1.0, 0.0));
        pVec2Array->push_back(osg::Vec2(1.0, 1.0));
        pVec2Array->push_back(osg::Vec2(0.0, 1.0));
        // 步骤六:设置纹理环境
//        osg::ref_ptr<osg::TexEnv> pTexEnv=new osg::TexEnv;
//        pTexEnv->setMode(osg::TexEnv::Mode::BLEND);
//        pTexEnv->setColor(osg::Vec4(1.0,0.0,0.0,1.0));
        // 步骤七:关联纹理状态(包括纹理和纹理环境),通过osg::StateSet
        osg::ref_ptr<osg::StateSet> pStateSet = pGeometry->getOrCreateStateSet();
        pStateSet->setTextureAttributeAndModes(0, pTexture2D.get(), osg::StateAttribute::ON);
//        pStateSet->setTextureAttributeAndModes(0, pTexEnv.get(), osg::StateAttribute::ON);
        // 步骤八:为唯一的法线创建一个数组    法线: normal
        osg::ref_ptr<osg::Vec3Array> pVec3ArrayNormal = new osg::Vec3Array;
        pGeometry->setNormalArray(pVec3ArrayNormal.get());
        pGeometry->setNormalBinding(osg::Geometry::BIND_OVERALL);
        pVec3ArrayNormal->push_back(osg::Vec3(0.0, 1.0, 0.0));
        // 步骤九:由保存的数据绘制四个顶点的多边形
        pGeometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 4));
        // 步骤十:将图形添加进几何节点
        pGeode->addDrawable(pGeometry.get());

    }
    pCamera->addChild(pGeode);  // 几何背景贴图为底图
    pGroup->addChild(pCamera);
    pGroup->addChild(pNode);    // 插入草地
//    pGroup->addChild(pGeode);   // 几何背景又插入一次中间作为元素
    // 设置漫游器,并禁止拽拖自动旋转
    osg::ref_ptr<osgGA::TrackballManipulator> pManipulator = new osgGA::TrackballManipulator;
    pManipulator->setAllowThrow(false);

    return pGroup.get();
} 

プロジェクト テンプレート: 対応するバージョン番号 v1.31.0

  (途中に予言プロジェクト用のバージョン番号がいくつかありますが、後でバージョン26~30に戻ります)
  ここに画像の説明を挿入します


前の記事: 「OSG 開発ノート (28): OSG モデルの固定パス アニメーション
次の記事: 継続的に追加...


この記事のブログ アドレス:https://blog.csdn.net/qq21497936/article/details/134064988

おすすめ

転載: blog.csdn.net/qq21497936/article/details/134064988