Skip to content

Instantly share code, notes, and snippets.

@zgock999
Last active October 20, 2020 02:32
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save zgock999/6c74f16ae4b1958e8b8977ec3d26deb5 to your computer and use it in GitHub Desktop.
wavefront OBJで学ぶ3Dフォーマットの基礎

wavefront OBJで学ぶ3Dフォーマットの基礎

末代 Advent Calendar 12/24分になります。こんにちわ。末代の老害こと@zgock999@mstdn.maud.ioです。

お前誰よ?

  • openSUSEユーザー会さんの末端として主にOSC名古屋で仮想化関連のセミナーしてたり
  • 15年前ぐらいから趣味で3DCGを細々とやってたり
  • 10年ぐらい前から自力でトゥーンシェーダ書いたり(こんなの
  • 家に二桁枚数のビデオカードが転がってたり

するだけのただの一般家庭のパパですよ

何書こうかねぇ

何書くか迷いましたが、書いてるのがgistということもあり、あんまりふざけたこと書くのもアレよねということで、 末代の由来であるアレの影響もあり、3D関連に興味をお持ちの方もそれなりにおられるやろということでそっち方面でもと思い、 wavefront OBJの話でもしようかと思います

誰得情報だよという話もありますが

末代アドカレって誰得情報のたまり場なんでしょ?

ということで(をい)

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ファイルをパースする

objファイルのパースは簡単です

  • 1行読んで、先頭が#ならスキップする
  • 1stワードで定義の種類がわかるのでしかるべき処理に分岐
  • 2ndワード以降から定義の種類に応じて頂点、法線、UV、面リストに格納

パースが簡単なので、例えば「メッシュを読み込んで、Y座標が3以上の頂点をジャスト3にして、"メッシュの頭を平らにする"」程度の処理は下手にモデラを使うよりもさくっと行えたりして便利です

各種ライブラリ

上記の通り単純なフォーマットでなので、各種言語にもobjファイル関連のライブラリは結構あります

python

Pywavefront pipで入ります

ruby

wavefront-obj gemで入ります(rubyは専門外につき詳しくないです)

node.js

wavefront-obj-parser npmで以下略(専門外なのでry)

まとめっぽいの

3Dを扱う時、基礎教養レベルで扱うことになりがちなwavefront OBJ、皆さんも弄りましょう

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment