末代 Advent Calendar 12/24分になります。こんにちわ。末代の老害こと@zgock999@mstdn.maud.ioです。
- openSUSEユーザー会さんの末端として主にOSC名古屋で仮想化関連のセミナーしてたり
- 15年前ぐらいから趣味で3DCGを細々とやってたり
- 10年ぐらい前から自力でトゥーンシェーダ書いたり(こんなの)
- 家に二桁枚数のビデオカードが転がってたり
するだけのただの一般家庭のパパですよ
何書くか迷いましたが、書いてるのがgistということもあり、あんまりふざけたこと書くのもアレよねということで、 末代の由来であるアレの影響もあり、3D関連に興味をお持ちの方もそれなりにおられるやろということでそっち方面でもと思い、 wavefront OBJの話でもしようかと思います
誰得情報だよという話もありますが
ということで(をい)
末代の皆様の中には例のアレのmodを作成されたり、あるいはmod作成に興味をお持ちの方も多いと思いますが、 メッシュ情報のやりとりをするのにwavefront OBJ形式のファイルのお世話になることも少なくないのではと思います。 wave front OBJ形式はWavefront Technologiesが自社製品用に作ったフォーマットですが、
- 基本シンプルなテキスト形式
- 頂点/法線/面定義と、メッシュの情報格納に必要な部分は押さえてる
- 面グループ、マテリアル定義もシンプル
ということで数多くのツール類でサポートされ、実質3Dメッシュをツール間でやり取りする際のスタンダードフォーマットになっています
Wikipediaのwavefront OBJのページに全部書いてあるので省略
と言うと怒られそうなのでおおまかなところだけ 基本的に行1つで頂点/法線/面定義を行います
v [x座標],[y座標],[z座標]
v 1.0,-1.0,0.5
v -1.0,1.0,-0.5
第四パラメータとしてwを指定することも可能ですが、一般的なポリゴンメッシュ情報を格納する時は使いません
vn [xベクトル],[yベクトル],[zベクトル]
vn 0.707 0.000 0.707
フォーマットとしては単位法線であることを保証する必要はないですが、自分で吐くときは単位法線にしといた方が安心ですね
vt [u],[v]
vt 0.2,0.5
テクスチャ起点(左上起点が一般的ですがそうじゃないツールもある)は特に規定がないのでやりとりでマテリアル崩れが起きることがある場合大概ここです
f [頂点インデックス]/[UVインデックス]/法線インデックス を三つ以上(三角以上であればn角形ポリゴンでもよい)
## 頂点しか持たない(インデックスは1オリジンなのに注意)
f 1 2 3
## 頂点とUVを持つ
f 1/1 2/2 3/3
## 頂点とUVと法線を持つ(大概はこれ)
f 1/1/1 2/2/2 3/3/3
## 頂点と法線を持つ
f 1//1 2//2 3//3
インデックス-1等、インデックスが負の場合「ここまでに定義された頂点リストの末尾からn番目」を意味しますが、これも時々対応してないツールがあるので注意
基本これだけです
objファイルのパースは簡単です
- 1行読んで、先頭が#ならスキップする
- 1stワードで定義の種類がわかるのでしかるべき処理に分岐
- 2ndワード以降から定義の種類に応じて頂点、法線、UV、面リストに格納
パースが簡単なので、例えば「メッシュを読み込んで、Y座標が3以上の頂点をジャスト3にして、"メッシュの頭を平らにする"」程度の処理は下手にモデラを使うよりもさくっと行えたりして便利です
上記の通り単純なフォーマットでなので、各種言語にもobjファイル関連のライブラリは結構あります
Pywavefront pipで入ります
wavefront-obj gemで入ります(rubyは専門外につき詳しくないです)
wavefront-obj-parser npmで以下略(専門外なのでry)
3Dを扱う時、基礎教養レベルで扱うことになりがちなwavefront OBJ、皆さんも弄りましょう