ホーム < ゲームつくろー! < ゲームプログラマのためのBlender

ゲームプログラマのためのBlender
その5 Blenderからモデルを出力してみる


 さて、Blenderからゲーム用のモデルを出力してみます。



@ Blenderがサポートする出力

 2014.10現在のBlenderバージョン2.72がサポートする出力(Export)は次のようになっていました:

それぞれを極々簡単に説明します:

Collada(.dae) XMLで記述される代表的なモデルフォーマットの一つ。
とっても有名、結構メジャー。
Stanford(.ply) 3Dスキャナ用としてデザインされたフォーマット。
ASCII及びBinary出力がある。
プロパティが単純なので扱いやすいかも。
Stl(.stl) 3次元CADソフト用のファイルフォーマット。
CAD業界では多用。
三角形ポリゴンと法線のみ定義なので、ゲーム用には向かない。
3D Studio(.3ds) Autodeskの3ds Max用のフォーマット。
お高いソフト用のフォーマットなので高機能。
でもゲーム用に読み込むには難しいかも。
Autodesk FBX(.fbx) Autodeskの代表的なファイルフォーマット。
3Dモデリングソフト間でデータ互換を保てるよう頑張っている。
FBX SDKが公開されているのでデータをC++で読み込める。
Wavefront(.obj) 頂点座標や法線など3Dモデルの形状を記述するシンプルなフォーマット。
テキストなので中を見て「あ〜」と分かるほどシンプル。
ゲーム用として使うにちょっと情報が足りないかも。
X3D Extensible 3D(.x3d) ISO国際標準の3DCGファイルフォーマット。
きっと色々情報を収められるのだろうけど何か難しい(^-^;

Blenderはゲーム専用の3Dモデリングツールでは無いので、一般的な3Dモデリング用のフォーマットが並んでいます。並んでいるフォーマットを見るに、ゲーム用のオブジェクトを出力する物としてはやはりメジャー所のColladaかFBXが選択肢かなという所です。ColladaもFBXもデータをインポートするSDKがあります。

 ColladaにはCollada DOM、FCollada、Open ColladaというSDKがありますが、実はどれも微妙な情勢。Collada DOMはColladaのバージョンに厳格、FColladaはサポートバージョンが広いけども現在サポート終了、そしてOpen Colladaはリファレンス情報に乏しいようです。

 FBXにはFBX SDKがあり、これはAutodeskが公開しています。こちらは現行でもサポートが続いています。バージョンが上がる毎に何かコロコロと変わる使用者泣かせの面もありますが、最近は割と安定的になって来ている感があります。

 という事で、やっぱりFBXなのかなというのが私の見解です。



A プリミティブを置いてFBXでエクスポート

 ではBlender内に立方体(Cube)プリミティブを一つ置いて、それをFBXで出力してみましょう。

 起動して置かれているのはとりあえず消しましょう(^-^;。ビューを空っぽにした段階で[Add]→[Mesh]→[Cube]で世界に立方体を置きます。次に設置位置を(2.0, 1.0, 3.0)にしておきましょう:

次に[File]→[Export]→[Autodesk FBX]を選択します。するとエクスポート画面が出てきます:

画面左側が出力オプションです。ここは慎重に設定する必要があります。右側でエクスポート先のフォルダを指定します。

○ Version

 左のパネルでまず定めるべきは[Version]です:

どうやらFBX 6.1 ASCIIとFBX 7.4 binaryをサポートしているようです。7.4の方は出てきたコメントにあるようにまだ開発段階とのようなので、安定しているであろう6.1を選択ですね。ただ6.1はASCII、つまりテキスト出力なのでサイズはやや大きくなります。でも人の目で見てわかる利点もあるのでお勧めです(^-^)


○ Selected Object

 Selected Objectにチェックを入れると、選択されているオブジェクトのみがエクスポート対象になります。通常モデルデータのみを出力する事が殆どなので、モデルを選択してこのチェックを付けて出力しますが、結構ヒューマンエラーが起こりやすい所でもあります。


○ Scale

 次のScaleは、Blender内のワールドの単位に掛ける倍率(スケール変換)です。良くあることなのですが、Blender等のモデリングソフトの単位とゲーム内の単位が違ってしまう事があります。例えばモデリングソフトの単位がcmでゲーム内の単位がmだとして、スケール変換無しにするとゲーム内に巨大なモデルが出現してしまいます。それを合わせる為にこの数値で調整します。ただ、実際はちゃんとデザイナさんと単位を合わせるのがベストです。


○ Forward, up

 Forward(前方向)とUp(上方向)はモデルの軸の方向をゲームの軸の方向に合わせる補正です。Blenderは右手系座標で床がXY平面になっているのでZ-Upです。一方DirectXは左手系Y-Upなので座標系が全然違います(^-^;。他のプラットフォームもそれぞれが独自の座標系になっている事が多いので、このオプションの設定は大抵必須です。

 例として、デザイナさんがBlenderの床に立つようなモデルをY軸の方向を前方だとして作ったとするなら、DirectXに合わせる場合はFowardを[Y Forward]、Upは[Z Up]と設定します。双方の軸を「前方」「上方向」と役目で合わせようというわけです。


○ Apply Transform

 これにチェックを入れると回転やスケールなどによる変換を頂点座標に施して(bake:ベイク)から出力します。例えば市街地をモデリングする時は、建物のモデル等を座標変換や回転させて配置する事になります。でもゲーム内ではそれをワールド座標として使う事が殆どです。そう言う場合に座標変換値をベイクしてしまうと扱いやすくなります。ケースバイケースですね。


○ Empty, Camera...

これらは出力対象とするオブジェクトの種類です。色が付いている物は出力対象になります:

Empty 空モデル(空ノード) メッシュが存在しない位置の情報だけのノード
Camera カメラ Blenderが定義するカメラ。モデルを出力する時は除くのが普通
Lamp ランプ ライトの事です。これもモデルの場合は除くのが普通
Armature アーマチュア 骨(ボーン)の事です
Mesh メッシュ ポリゴンメッシュ。多くの場合は出力ONにします
Other その他 これら以外の要素

モデルを出力する時にはカメラとライトは必要無いため除きます。Otherには何か入るかもしれないのでとりあえず付けておきます。


○ Apply Modifier

 Modifierというのはオブジェクトをゆがませたりする特殊なエフェクトです。チェックを入れるとそれが適用された頂点座標を出力します。ケースバイケースです。


○ Smoothing

 頂点座標や法線にスムージング補間を入れるかどうかを指定します。普通はデザイナさんが調整してくれるので入れないですね。


○ その他

 残りの項目は次の通りです:

Loose Edge チェックを入れると2頂点ポリゴンなど何か
縮退してしまっているエッジもそのまま出力します
Tangent Space 接空間ベクトルを頂点情報に含めます。法線マップを
適用している時には入れないと面倒臭い事になります
Only Deform Bones なんだこれ!(笑)ちょっとわかりません(^-^;;;
Custom Property ユーザが独自に作ったカスタムプロパティを出力します。
こういうのゲーム用モデルでは良く使います
Baked Animation アニメーションを焼き付けします。
これを入れると1フレーム毎の姿勢が計算されて出力されます。
デザイナさんが付けてくれたアニメーションをほぼ忠実に
再現できますが、データ量は膨大になります。
NLA Strip 不明
All Action 不明!

まぁ分からないのはそのままにしておきましょう(^-^;;;


 おおよそ上記を設定する事でゲーム用のFBXモデルを出力する事が出来ます。次のようなオプション設定で最初に置いた立方体を出力してみます:

FBX 6.1 ASCIIでY Forward、Z Up、出力はMeshのみ、Animationは切ります。右側の欄で出力するフォルダ先まで行き、.fbxファイル名をちゃんと入れて[Export FBX]をクリックすると出力されます。



B 三角化!

 さて、Aで出力したFBXの中の一部を抜粋します:

出力したFBX(ASCII)
Vertices:
 -1.000000,-1.000000,-1.000000,-1.000000,1.000000,-1.000000,
 1.000000,1.000000,-1.000000,1.000000,-1.000000,-1.000000,
 -1.000000,-1.000000,1.000000,-1.000000,1.000000,1.000000,
 1.000000,1.000000,1.000000,1.000000,-1.000000,1.000000

PolygonVertexIndex:
4,5,1,-1,5,6,2,-2,6,7,3,-3,7,4,0,-4,0,1,2,-4,7,6,5,-5

改行を入れて見やすくしています。上の1.0祭りは頂点座標です。そして下の太文字の数字の羅列はインデックスバッファです。ただちょっと不思議がありますよね。インデックスバッファなのにマイナス値があります。これはFBX独特の表現で、このマイナスの所で1ポリゴン分の区切りになっているんです。使う時にはマイナスの所で区切り、マイナス値は「反転して1引きます」。試しに上のインデックスバッファをポリゴン別に直してみましょう:

インデックスの並び
4,5,1,0,
5,6,2,1,
6,7,3,2,
7,4,0,3,
0,1,2,3,
7,6,5,4

このように、一つのポリゴンが4つのインデックス(頂点)で表現されています。つまり四角ポリゴンになってしまっています。これではゲームのモデルとしては使えません。ゲームのモデルとして使えるのは三角ポリゴンだけです。

 つまり、モデルを出力する前にポリゴンは「三角化」する必要があります。これはほぼ全てのモデリングソフトに標準機能として搭載されています。Blenderの場合、ポリゴンメッシュを三角化するには次のような操作をします。まず、ビューの下にある[Object Mode]を[Edit Mode]に切り替えます:


 ↓

これはオブジェクトの頂点やエッジや面などを操作するモードです。Edit Modeにしたら、[Mesh]→[Faces]→[Triangulate Faces]を選択します。ショートカットは[Ctrl + T]です:

こうすると、選択したオブジェクトのポリゴンが三角化されます:

そしてFBXとしてエクスポートすると先程のインデックスバッファはこうなります:

出力したFBX(ASCII)
PolygonVertexIndex:
5,1,-1,
 6,2,-2,
 7,3,-3,
 4,0,-4,
 1,2,-4,
 6,5,-5,
 4,5,-1,
 5,6,-2,
 6,7,-3,
 7,4,-4,
 0,1,-4,
 7,6,-5

はい、ちゃんと三角ポリゴン12枚になりました。

 FBXへの出力はデザイナさんとプログラマとの境界にあたる作業なので、プログラマがしっかり機能を把握して適切な出力をしてもらうように指示しなければなりません。今回の出力はそういう意味ではまだ機能把握の入り口です。少しずつ掘り下げて行きましょう。