今回の回転画像はhisayanさんの「女性海上自衛隊制服」を使用させていただきました。「女性海上自衛隊制服」はくるるの他に、Aiko2、TY2、にあ☆みぃの制服がセットになっています。
髪にはmayutaさんの「mayuta_kururuHair」を使わせていただいていますが、帽子の形に合わせて少し変形させていただいてます。
服はPoser Clubから、髪はPoser Clubまたはmayutaさんのサイトから入手可能です。
今回はPoserとの連携でBlenderをモデリングツールとして使用する際に重要となるWavefrontOBJ形式でのインポート/エクスポート機能について書いてみたいと思います。
以前こちらのブログで標準のOBJ入出力スクリプト以外のスクリプトを使ってOBJファイルをインポート、エクスポートする方法について少し記事を書いていますが、Ver.2.45での標準のOBJ入出力機能について改めて見てみたいと思います。
BlenderのOBJインポート/エクスポートについては、英語マニュアルなどにも詳しい説明は見当たらないようですので、今回は実際にデータを書き出したり読み込んだりした結果を調べたり、スクリプトのコードを見たりした内容を元にして記事を書いています。
このため以下の内容には、一部不正確なところなどもあるかもしれません。
●Wavefront OBJファイルの記述内容
ここで簡単にWavefront OBJファイルがどのように3Dデータを保持しているか、説明させていただきます。
こちらのリストはMetasequoiaで基本形状の平面、立方体、三角柱を並べただけの簡単な3DデータをWavefront OBJ形式で出力したものです。
リストの横にも簡単な説明を書いてありますが、もう少し補足します。


このリストのデータは大きく分けて3つの部分から成り立っています。
初めに頂点データ、次にUV頂点データ、最後に面データです。
今回のデータには含まれていませんが、この他に頂点の法線データも含めることができます。また、逆にUV頂点データが含まれずに頂点データ、面データのみという場合もあります。
注意して見ていただきたいのが、面データの中の「g obj1」「g obj2」「g obj3」の部分です。
「obj1」というのが平面、「obj2」が立方体、「obj3」が三角柱になります。
「obj1」という平面は面データの
g obj1
f 1/1 2/2 4/3 3/4
この2行で記述されています。
「f」の次に続く「1/1」「2/2」「4/3」「3/4」の部分で「/」の左側の数字を見ることで、面を構成する頂点データがそれぞれ1,2,4,3番目のものであることが分かります。
頂点データの1行から4行までを見ると、それぞれの頂点の座標値が分かります。
v -218.058167 0.000000 -100.000000
v -418.058167 0.000000 -100.000000
v -218.058167 0.000000 100.000000
v -418.058167 0.000000 100.000000
UV頂点のデータは「/」の右側の数字を見ることで、1,2,3,4番目であることが分かります。
UV頂点データの1行から4行までを見ることで、UV頂点の座標が分かります。
vt 0.00000 1.00000
vt 1.00000 1.00000
vt 1.00000 0.00000
vt 0.00000 0.00000
「obj2」「obj3」についても同様にして、それぞれの形状を構成する面の頂点データ、UV頂点データの座標値を知ることができます。
Blenderで同様の基本形状をWavefrontOBJ形式で出力したものは、こんな感じになっています。


オブジェクト名が「Plane」「Cube」「Cylinder」となっている他に、先ほどのMetasequoiaのものと随分違っているように見えます。
全体の行数が増えているのはUV頂点のデータが整理されず、全ての面の頂点について一つ一つ書き出されているためです。
また、先ほどは頂点データ、UV頂点データ、面データがそれぞれまとまっていて、グループ分けの情報が面データの中にあったのに、こちらでは各グループごとに頂点データ、UV頂点データ、面データが分離されています。
●●インポート●●
「File」メニュー「Import」-「Wavefront(obj)...」で実行します。


○Import...
●Smooth Groups
面のスムースグループの設定を読み込みます。
スムースグループは、OBJファイル中で面データの中に「s 1」「s off」というように記述されています。

●Create FGons(デフォルト)
オンでは4つ以上の頂点で構成される面をそのまま再現します。
オフでは4頂点以下の面に変更して読み込みます。

●Lines(デフォルト)
面を構成していない単独の辺を再現します。
オフでは、頂点のみ読み込みます。

○Sepparete objets from obj...
●Object(デフォルト)
OBJファイルのオブジェクトをBlenderのオブジェクトとして読み込みます。
「o オブジェクト名」のグループ指定でオブジェクト分けされます。
●Group(デフォルト)
OBJファイルのグループをBlenderのオブジェクトとして読み込みます。
「g グループ名」のグループ指定でオブジェクト分けされます。
●Material(デフォルト)
OBJファイルのマテリアル設定でオブジェクトを分割します。
「usemtl マテリアル名」のマテリアル設定でオブジェクト分けされます。
これらのボタンはそれぞれ別々にオン/オフの設定が可能で、全てオフにすればすべてのデータが一つのオブジェクトとして読み込まれます。
下のリストのOBJファイルには「o オブジェクト名」「g グループ名」「usemtl マテリアル名」のそれぞれのグループ分け指定があります。

このファイルのデータを「Object」「Group」「Material」の各ボタンをそれぞれオン/オフした場合のグループ分けの結果は以下のようになります。
・「Object」のみオン
オブジェクトは「オブジェクト名」でグループ分けされます。

・「Group」のみオン
オブジェクトは「グループ名」でグループ分けされます。

・「Material」のみオン
オブジェクトは「マテリアル名」でグループ分けされます。
このデータでは、オブジェクトのそれぞれに一つのマテリアルを設定してありますが、全てのオブジェクトに同一マテリアルを設定してあれば、そのマテリアル名のついた一つのオブジェクトとして読み込まれ、逆に一つのオブジェクトに複数のマテリアル設定がしてあれば、そのマテリアルの数だけ分割されることになります。

・「Object」と「Group」をオン
「Object」「Group」両方が混在している場合、ファイル中の「o オブジェクト名」「g グループ名」の記述の仕方によって読み込んだオブジェクトのグループ分けがかなり変わることがあります。
具体的には、面の記述の直前にある記述が有効になり、「Object」のみオン、「Group」のみオンのどちらかと全く同じ結果になったり、両方が混在する結果になったりします。

・「Object」と「Material」をオン
オブジェクトは「オブジェクト名_マテリアル名」でグループ分けされます。
つまり、まず「オブジェクト名」で分けられ、そのオブジェクトに複数のマテリアルが設定されていれば、さらにその数だけ分けられます。

・「Group」と「Material」をオン
オブジェクトは「グループ名_マテリアル名」でグループ分けされます。
つまり、まず「グループ名」で分けられ、そのグループに複数のマテリアルが設定されていれば、さらにその数だけ分けられます。

・全てオン
「Object」「Group」両方をオンにしたときの結果を、さらに「Material」で分割したものとなります。
作成されるオブジェクトの名前は「オブジェクト名_マテリアル名」「グループ名_マテリアル名」のどちらかになりますが、どちらになるかはOBJファイル中の記述によって変わります。

・全てオフ
オブジェクトは一つのオブジェクトになります。
オブジェクト名はOBJファイルのファイル名となります。

○Options...
●Morph Target
WavefrontOBJファイルの読み込みで頂点順序を維持したい場合にオンにします。
「Morph Target」ボタンをオンにすると、「Separate objects from obj...」のボタンを設定が無視され、グループ分けされません。
●Clamp Scale: 10.00
大きいスケールのデータを読み込むとき、ここで指定した大きさ以上にならないように読み込むデータのスケールを自動的に制限します。
具体的には「メッシュ形状のX,Y,Z方向のうち最大幅がClamp Scaleに収まるまで、サイズを1/10にする計算を繰り返す」というようなことを行っているようです。
読み込むデータのスケールを具体的な数字で指定する、というものではありません。
●Image Search
テクスチャに使用している画像ファイルをフォルダの下の階層まで検索します。
○バッチロード
OBJインポートのスクリプトを実行する際、キーボードの「Shift」キーを押していると、フォルダ中のOBJファイルをまとめて読み込むモードになります。
この方法で複数のOBJファイルを読み込むと、それぞれのOBJファイルのデータが別々のシーンに読み込まれます...のでかなり使いづらいような気がします。

●●エクスポート●●
「File」メニュー「Export」-「Wavefront(obj)...」で実行します。


○Context...
●Selection Only(デフォルト)
このボタンがオンになっていると、現在のシーンで選択されているものだけを出力します。
「Shift」キーを押しながら複数選択することで、複数のオブジェクトを出力することができます。
オフにすると非選択のオブジェクトも含めた、シーン中の全てのオブジェクトを出力します。



●All Scene
オンにすると、全てのシーンを別々のファイルとして出力します。
オフでは、現在のシーンのみを出力します。


●Animation
オンにするとアニメーション範囲の全フレームを、それぞれ別々のファイルとして出力します。
アニメーション範囲の設定はButtons Windowの「Scene」「Render Buttons」ボタンを選択して表示される「anim」パネルで設定します。オフでは現在のフレーム位置のみを出力します。


○Object Prefs...
●Apply Modifiers(デフォルト)
Subsurf、MirrorなどのModifierを適用した状態で出力します。


●Rotate X90(デフォルト)
X軸で90度回転した状態で出力します。


●Morph Target
このボタンをオンにすることで頂点順序を変更しないようにOBJファイルへ出力することができます。
この場合、「Grouping...」のボタン設定は全て無視され、グループ分けされない状態で出力されます。また、Modifierの設定がある場合、Modifierを適用しない状態で出力されます。
○Extra Data...
●Edges(デフォルト)
3頂点以上の面を構成していない辺も面データとして出力します。
オフの場合でも頂点データは出力されます。


●Normals
頂点法線データを出力します。
●High Quality No(デフォルト)
レンダリング用に高品質な法線計算を行います。
●UVs(デフォルト)
UV頂点データを出力します。
Blenderの基本図形は作成しただけではUVの設定はされていないようで、このボタンがオンになっていてもUV頂点データが出力されません。一度、UV編集のための画面を表示するとで、UV頂点データが出力されるようになります。

●Materials(デフォルト)
OBJファイルと別に、マテリアルファイル(.mtl)を作成します。
●Copy Images
テクスチャ画像を同じフォルダにコピーします。
●Triangulate
面を三角ポリゴンにして出力します。

○Grouping...(書き出し時のパーツ分割)
BlenderからOBJ出力する際、複数オブジェクトを選択して一つのOBJファイルとして出力することで、各オブジェクトをグループ分けした状態で出力することができます。
●Objects(デフォルト)
●Object Groups
Blenderでは、デフォルトではOBJ出力のダイアログで「Grouping...」の部分のボタン「Object」がオンになっています。
この状態のままでファイル出力すると、オブジェクトはOBJファイル中で「o オブジェクト名」という形でグループとして出力されます。
ただし、MetasequoiaやPoserなどではこの「o オブジェクト名」という記述はグループとしては認識されませんので、グループ分けされていないデータと同じように扱われます。
オブジェクトを「g オブジェクト名」というようにグループ分けするには、「Object」ボタンをオフにして「Object Groups」ボタンをオンにします。
両方がオンになっていると、「Object」ボタンの方が優先されてしまいますので注意が必要です。

Blenderではオブジェクト名の他に、そのオブジェクトの実体となるメッシュや曲面などにも名前があります。
Blender起動直後に基本図形などを作成した時点では普通両者は同じ名前になっていますが、いろいろな編集作業などを続けていると、オブジェクト名とメッシュ名が一致しなくなることがよくあります。
その場合、「g オブジェクト名」の部分は「g オブジェクト名_メッシュ名」のようになります。
・オブジェクトの順序について
オブジェクトの順序は、Blender上で自由に変更できません。
outlinerの表示はabc順に自動で並び替えられていますが、OBJ出力する際にはこの順序はまったく関係ありません。
基本的に、オブジェクトが作成された順序がそのまま維持されるようですが、出力時には順序が逆になり、最後に作成されたオブジェクトがファイルの先頭に書き込まれ、一番最初に作成されたオブジェクトがファイルの末尾になるようです。
●Material Group
「Grouping...」には、このほかに「Material Groups」というボタンもあります。
このボタンをオンにすると、オブジェクトをマテリアルでグループ分けすることができます。
グループ分けは「g オブジェクト名_メッシュ名_マテリアル名」という形で行われます。
3つのボタンの組み合わせで、出力される内容は以下のように変わります。


今回のくるるちゃんは、ボーイッシュな
魅力で可愛いですネ!
hisayanさんの衣装がとても良く似合って
います。
それとBlenderの記事は、いつもながら
詳細に書かれてあり感心致します。
matoさんのおかげでBlenderユーザーに
なろうかなと思う方が多いのでは?
(ちなみに私はBlenderでのUV展開に興味があります)。
matoさんの記事を最初から読んでみよっと
(^^)
特に最近は良く使う機能なので有り難いですね。
コメントをありがとうございます。
hisayanさんの衣装、いつも勝手にコンバートして使ってしまって申し分けなく思っているのですが、今回はくるる用に作っていただいた服ということもあって、くるるさん本人もちょっと誇らしげな感じ...かもしれません。
BlenderのUV機能は、かなり便利だと思います。ぜひ、試してみてください。
こんばんは。
BlenderのOBJ入力ダイアログで「Object」と「Group」がどう違うのかさっぱりわからなかったり、「Clamp Scale」がよく分からなくて色々もやもやしていたので、まとめて調べてみました。
おかげでPythonスクリプトにだいぶ詳しくなりました(嬉しいのか、悲しいのか...)。
記事の内容はちょっと難しかったです。でもこう言うことをきちんと理解しているのといないのでは、モデリングにも差が出てくるんでしょうね。
違う話ですけど、サイト移転しました。
それでリンク変更のお願いに来たんですけど、すでに変更されてましたね。ありがとうございます。
あらためましてよろしくお願いします。
私は以前OBJファイルを読み込むプログラムを書いたりしていることもあって、必要以上に細かいことまで書いてしまったかなと少し反省しています。
普通に3DCGを楽しむには、ファイルの中身のことまでは、あまり気にする必要はないかもしれません。
サイト移転の記事を拝見して、すぐに変更させていただきました。
独自ドメインというのがすごいですね。
こちらこそ、よろしくお願いします。