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 のどこで指定すればいいのか分からない…。
[ ツッコむ ]
#2 [nitijyou] 床下の水を組み上げようとした
昨日かなりの雨が降ったのだけど。「床下に水が溜まっているのではないか。汲み出せ」と親父さんが言い出したので、朝から床下の水の汲み出し作業をしてみた。
水を溜めておく堀(?)が満杯になって溢れていた…。横に置いてあった電動ポンプの電源供給部まで水に浸かっていた。ここまで水はこないだろうと安易に思って置いてたのだけど、失敗した…。何か台でも設置して、その上に置いておけばよかった。
汲み出しを始めてみたけれど、全く水位が変化しない。08:00-17:00まで動かしてみたけど、1cm下がったか下がってないかというレベル。
親父さんが、普段風呂の水を畑に持っていくために使っている電動ポンプ、TERADA SL-52 の存在を思い出してくれて、庭の水撒き用ホース6mを繋いで汲み出し状況を改善してくれた。
しかし、堀が空になっても、物凄い勢いで周りから水が流れ込んでくる…。10秒ぐらいでまた堀が満杯に。この勢いでは小さい電動ポンプで汲み出せるわけがない。これじゃまるで川だか沼だかの中に家が建ってるような状況…。
水を溜めておく堀(?)が満杯になって溢れていた…。横に置いてあった電動ポンプの電源供給部まで水に浸かっていた。ここまで水はこないだろうと安易に思って置いてたのだけど、失敗した…。何か台でも設置して、その上に置いておけばよかった。
汲み出しを始めてみたけれど、全く水位が変化しない。08:00-17:00まで動かしてみたけど、1cm下がったか下がってないかというレベル。
親父さんが、普段風呂の水を畑に持っていくために使っている電動ポンプ、TERADA SL-52 の存在を思い出してくれて、庭の水撒き用ホース6mを繋いで汲み出し状況を改善してくれた。
しかし、堀が空になっても、物凄い勢いで周りから水が流れ込んでくる…。10秒ぐらいでまた堀が満杯に。この勢いでは小さい電動ポンプで汲み出せるわけがない。これじゃまるで川だか沼だかの中に家が建ってるような状況…。
◎ 電動ポンプを物色 :
今回のような状況になった場合、それなりのスペックの電動ポンプが必要だなと…。今まで使ってた小さい電動ポンプでは全く歯が立たない。しかし、どのくらいの値段の製品を購入すればいいのだろうか…。
今回最終的に使った TERADA SL-52 の価格を調べてみたけど、既に生産終了品になっていて値段は分からなかった。ただ、現行品の SL-40 が12,000 - 18,000円ぐらいで販売されているようなので、SL-52 も同じくらいか、もしくはもっと高い値段だったのではないかと…。
中国メーカの製品なら 1,980円ぐらいから売られているけれど、価格差からして罠があるとしか思えない…。表記スペックを満たしてないとか、すぐに壊れるとかありそうだよな…。
今回最終的に使った TERADA SL-52 の価格を調べてみたけど、既に生産終了品になっていて値段は分からなかった。ただ、現行品の SL-40 が12,000 - 18,000円ぐらいで販売されているようなので、SL-52 も同じくらいか、もしくはもっと高い値段だったのではないかと…。
中国メーカの製品なら 1,980円ぐらいから売られているけれど、価格差からして罠があるとしか思えない…。表記スペックを満たしてないとか、すぐに壊れるとかありそうだよな…。
[ ツッコむ ]
以上、1 日分です。