2024/04/10(水) [n年前の日記]
#1 [prog][cg_tools] OpenGLでモデルデータを読み込めそうか調べてる。その2
C/C++ とOpenGLでモデルデータを読み込みたい。そのあたり何か良さそうなライブラリがあったりしないかとググっているところ。
モデルデータのフォーマットにも色々あるけれど、どのへんがいいだろう。とりあえず、gltf、もしくは、wavefront(obj)形式だろうか。
_glTF - Wikipedia
_Wavefront .objファイル - Wikipedia
モデルデータのフォーマットにも色々あるけれど、どのへんがいいだろう。とりあえず、gltf、もしくは、wavefront(obj)形式だろうか。
_glTF - Wikipedia
_Wavefront .objファイル - Wikipedia
◎ gltf用ライブラリ :
gltfの読み込み用ライブラリを探したら、以下に遭遇。
_syoyo/tinygltf: Header only C++11 tiny glTF 2.0 library
まだ試用してないけど、なんだか良さそう。色々なプロジェクトで使われているようでもあるし、Windows + MinGW でも利用できると書いてあるのもありがたい。
_syoyo/tinygltf: Header only C++11 tiny glTF 2.0 library
まだ試用してないけど、なんだか良さそう。色々なプロジェクトで使われているようでもあるし、Windows + MinGW でも利用できると書いてあるのもありがたい。
◎ obj用ライブラリ :
wavefront(obj)形式の読み込みライブラリを探したら、結構な数が見つかった。テキストファイルだし、フォーマットとしてシンプルなので、対応しやすいのだろう…。
_syoyo/tinyobjloader-c: Header only tiny wavefront .obj loader in pure C99
_tinyobjloader/tinyobjloader: Tiny but powerful single file wavefront obj loader
_Bly7/OBJ-Loader: A C++ OBJ Model Loader that will parse .obj & .mtl Files into Indices, Vertices, Materials, and Mesh Structures.
_tek-nishi/OBJ-loader: Wavefront OBJ loader with OpenGL 1.1, C++
_mojobojo/OBJLoader: stb-style obj loader for obj files output by blender
C/C++で書いたプログラムから、.objを直接読み込んで、解析して利用するようだなと…。
_syoyo/tinyobjloader-c: Header only tiny wavefront .obj loader in pure C99
_tinyobjloader/tinyobjloader: Tiny but powerful single file wavefront obj loader
_Bly7/OBJ-Loader: A C++ OBJ Model Loader that will parse .obj & .mtl Files into Indices, Vertices, Materials, and Mesh Structures.
_tek-nishi/OBJ-loader: Wavefront OBJ loader with OpenGL 1.1, C++
_mojobojo/OBJLoader: stb-style obj loader for obj files output by blender
C/C++で書いたプログラムから、.objを直接読み込んで、解析して利用するようだなと…。
◎ blenderからC言語の形式でエクスポート :
ググっているうちに、blenderから、C言語用の記述でモデルデータを直接エクスポートできるアドオンが存在しているという記事を見かけた。
_Blender OpenGL / C header exporter - ゲームが作れるようになるまでがんばる日記
_でらうま倶楽部 : Blenderのアドオン C header exporter がありがたい
_export - Get indices of vertices of triangulated faces in python - Blender Stack Exchange
しかし配布サイトは404。WebArchiveにページだけは残っていたけど…。
_Blender OpenGL / C header exporter... (WebArchive)
肝心のアドオンファイルは残ってなかった。ファイル名は、io_mesh_ogl-2.63.tar.gz、もしくは io_mesh_ogl_2.58.tar.gz だったようだけど…。
まあ、blender 2.63 時代のアドオンらしいので、今現在の blender では利用できない可能性が高いけど、どういう作りだったのかちょっと気になる。入手できないのは残念。
_Blender OpenGL / C header exporter - ゲームが作れるようになるまでがんばる日記
_でらうま倶楽部 : Blenderのアドオン C header exporter がありがたい
_export - Get indices of vertices of triangulated faces in python - Blender Stack Exchange
しかし配布サイトは404。WebArchiveにページだけは残っていたけど…。
_Blender OpenGL / C header exporter... (WebArchive)
肝心のアドオンファイルは残ってなかった。ファイル名は、io_mesh_ogl-2.63.tar.gz、もしくは io_mesh_ogl_2.58.tar.gz だったようだけど…。
まあ、blender 2.63 時代のアドオンらしいので、今現在の blender では利用できない可能性が高いけど、どういう作りだったのかちょっと気になる。入手できないのは残念。
◎ objをcに変換 :
wavefront(obj)形式を読み込んで、C/C++ の形に変換できるツールがあれば済むのではないかと思いついた。ググってみたら、やはりそういうツールを作った事例がある模様。
_glampert/obj2c: Simple command line tool to convert Wavefront OBJ models to C/C++ data arrays.
_Moon64/obj2c.py at main ・ UnderVolt/Moon64
C++で書かれた前者を試用してみることにした。環境は Windows10 x64 22H2 + MSYS2 (h++ 13.2.0)。
任意のフォルダを作成して、中に入って、githubからクローン。
MSYS2 の g++ 13.2.0 を使ってビルドする。以下で、obj2c.cpp から obj2c.exe が作れる。
注意点。MinGW g++ 6.3.0 でビルドしようとしたらエラーが出た。MSYS2 の g++ 13.2.0 ならエラーが出なかったし、exe も生成された。
使い方は以下。最後につけてる -c は、配列の個数も出力させるオプション。
ちなみに、-h か --help をつければヘルプが表示される。
それはさておき。blender 3.6.9 x64 LTS からエクスポートした .obj を変換してみたところ、たしかに頂点座標の配列等は得られたのだけど…。面毎に異なるマテリアルを指定しているのに無視されて、面情報は全部一つにまとめられてしまうようだなと…。
_glampert/obj2c: Simple command line tool to convert Wavefront OBJ models to C/C++ data arrays.
_Moon64/obj2c.py at main ・ UnderVolt/Moon64
C++で書かれた前者を試用してみることにした。環境は Windows10 x64 22H2 + MSYS2 (h++ 13.2.0)。
任意のフォルダを作成して、中に入って、githubからクローン。
mkdir obj2c cd obj2c git clone https://github.com/glampert/obj2c.git cd obj2c
MSYS2 の g++ 13.2.0 を使ってビルドする。以下で、obj2c.cpp から obj2c.exe が作れる。
g++ -o obj2c.exe obj2c.cpp -static
注意点。MinGW g++ 6.3.0 でビルドしようとしたらエラーが出た。MSYS2 の g++ 13.2.0 ならエラーが出なかったし、exe も生成された。
使い方は以下。最後につけてる -c は、配列の個数も出力させるオプション。
obj2c.exe INPUT.obj OUTPUT.c -c
ちなみに、-h か --help をつければヘルプが表示される。
> obj2c.exe --help Convert Wavefront OBJ mesh file to C/C++ data arrays. Usage: $ obj2c.exe <source-file> <target-file> [options] Options: -h, --help Shows this help text. -v, --verbose Be verbose; output a lot of info and timings. -s, --static_arrays If present, add the 'static' qualifier to array declarations. -c, --write_counts Write lengths of data arrays as constants. --inc_file[=name] If flag present, generate an include file externing the array variables. Incompatible with 'static_arrays'. If no filename provided, uses the target file name. -n, --smooth_normals If set, gen smooth per-vertex normals. Default are shared per-face 'flat' normals. -f, --vb_friendly Make the output 'Vertex Buffer friendly'. That is, single index per-vertex. --ib_type=<type> Index buffer data type for when using 'vb_friendly'. Possible values are 16, 16std, 32 and 32std. The 'std' suffix causes the use of the standard C data types found in <stdint.h> --no_uvs Don't output mesh UVs, even if they are present in the OBJ file. Created by Guilherme R. Lampert, Apr 10 2024.
それはさておき。blender 3.6.9 x64 LTS からエクスポートした .obj を変換してみたところ、たしかに頂点座標の配列等は得られたのだけど…。面毎に異なるマテリアルを指定しているのに無視されて、面情報は全部一つにまとめられてしまうようだなと…。
◎ blenderからobjをエクスポート :
blender 3.6.9 から wavefront (obj)形式でエクスポートしたものの、マテリアルファイル (.mtl) の中にカラー情報が出てこなくて結構悩んでしまった。しかし、これは単に自分の勘違いだった。RGB を 1.0 or 0.0 にして実験していたから一見分かりづらかっただけで、.mtl の Kd (diffuse, ディフューズ色)に、blender のマテリアルのベースカラーが反映されていることが確認できた。
Ks (Specular, スペキュラ色)は、blender のスペキュラーが対応してるようだなと…。ただ、blender上ではRGB別で指定できないように見える。また、Ns (スペキュラー指数)もどこで指定すればいいのやら…。
Ka (Ambient, アンビエント色)は、blender のどこで指定すればいいのか分からない…。
Ks (Specular, スペキュラ色)は、blender のスペキュラーが対応してるようだなと…。ただ、blender上ではRGB別で指定できないように見える。また、Ns (スペキュラー指数)もどこで指定すればいいのやら…。
Ka (Ambient, アンビエント色)は、blender のどこで指定すればいいのか分からない…。
[ ツッコむ ]
以上です。