🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

653閲覧

C++でバイナリフォーマットのモデルロード

isho

総合スコア4

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2019/11/27 02:12

編集2019/11/27 04:25

社内勉強会「レンダリング合宿1」 ソフトウェアラスタライザー基本実装編 01.座標変換
https://qiita.com/hrmtnryk/items/188ce13dcdcc289e9a61

このサイトを参考に、ソフトウェアラスタライザを勉強しながら作っているのですが、
3Dモデルの読み込みの箇所で「別途ローダーのソースが入ると面倒になるので簡素なバイナリフォーマットに変換して扱っています。」と書かれているのですが、
別のモデルを読み込みたいので同じバイナリフォーマットに変換して読み込みたいと思っています。

ちなみに、こちらがこのサイトでバイナリフォーマットを読み込んでいる箇所です。
iPhoneからの投稿なので、このURLのGitHub方が見やすいかもです。
https://github.com/NoriyukiHiromoto/Rendering01_SoftwareRasterizer/blob/01_04_polygon/project/Source/Application/Application.cpp

C++

1 2//===================================================================== 3// ファイルの読み込み処理 4//====================================================================== 5void Application::ModelLoad(const char* pFileName) 6{ 7 // ファイルパスの作成 8 std::string FullPath = pFileName; 9 size_t path_i = FullPath.find_last_of("\") + 1; 10 size_t ext_i = FullPath.find_last_of("."); 11 std::string Dir = FullPath.substr(0, path_i); 12 std::string ExtName = FullPath.substr(ext_i, FullPath.size() - ext_i); 13 std::string FileName = FullPath.substr(path_i, ext_i - path_i); 14 15 _MeshDatas = std::vector<MeshData>(); 16 17 // メッシュファイルを読み込み 18 HANDLE hFile = ::CreateFileA(pFileName, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); 19 if (hFile != INVALID_HANDLE_VALUE) 20 { 21 DWORD ReadedBytes; 22 23 MeshFileBinaryHead Head; 24 ::ReadFile(hFile, &Head, sizeof(Head), &ReadedBytes, nullptr); 25 26 if (Head.GUID == 'MBIN') 27 { 28 _MeshDatas.resize(Head.MeshCount); 29 for (auto iMesh = 0U; iMesh < Head.MeshCount; ++iMesh) 30 { 31 auto& Dst = _MeshDatas[iMesh]; 32 33 MeshFileBinary MeshBin; 34 ::ReadFile(hFile, &MeshBin, sizeof(MeshBin), &ReadedBytes, nullptr); 35 36 // ジオメトリデータ読み込み 37 std::vector<VertexData> VertexDatas(MeshBin.TriangleVertexCount); 38 ::ReadFile(hFile, &(VertexDatas[0]), sizeof(VertexData) * MeshBin.TriangleVertexCount, &ReadedBytes, nullptr); 39 40 // 頂点データ&頂点インデックス 41 uint16_t Index = 0; 42 for (auto&& v : VertexDatas) 43 { 44 Dst._Position.push_back(Vector3{ v.Position[0], v.Position[1], v.Position[2] }); 45 Dst._Normal.push_back(Vector3{ v.Normal[0], v.Normal[1], v.Normal[2] }); 46 Dst._Index.push_back(Index++); 47 } 48 } 49 } 50 51 ::CloseHandle(hFile); 52 } 53} 54

試したことは、3Dモデルをバイナリフォーマットに変換と読み込みが出来ないので、
自作でOBJファイルのローダーを制作しています。
ベストなのは、このサイトの通りのmbinという形式で読めれば色々と都合がいいので質問しています。

どうやればいいのか教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

horiegom

2019/11/27 04:35

>どうやればいいのか教えていただきたいです。 何を? >別のモデル とは具体的に何、どの形式。  >3Dモデルをバイナリフォーマットに変換と読み込みが出来ない 意味不明。エラーが出たのか、コードが書けないのか。
isho

2019/11/27 04:47

このサイトで使われているmbin形式とは別のモデルをmbin形式にして読みこみたいです。 現在使いたいモデルがOBJ形式だったので、このサイトで使われているmbin形式のバイナリフォーマットに変換する方法が分からないです。
guest

回答1

0

objをmbinに変換してください。
ModelLoad関数を読めばどういうフォーマットかは理解できると思います。

投稿2019/11/27 05:47

tatamyiwathy

総合スコア1045

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

isho

2019/11/27 09:50

すみません、それが上手く理解出来ていません。それを教えてもらう事は出来ますか?
tatamyiwathy

2019/11/28 01:07

「こうすればいいよ」と一言ですむ話ではないのでここで教えるのは難しいでしょう。それは費用が発生するレベルです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問