BlenderとUnity
About
3DCGモデルを製作するためのソフトウェアはいくつかあって、メジャーなところではAutodesk社のMayaや3dsMAX、他にLightwave、Shade、Blender、日本ではMetasequoiaなどがあります。Autodesk社の製品は値段が高く、スタンドアロン版を購入しようとすると50万円以上、Lightwaveでは15万以上してしまうので、多くの個人製作者の場合にはそれ以外のソフトウェアで対応していると思います。
中でもBlenderは無料で利用することができ、高機能であるため利用されることが多いようです。ゲーム開発で標準的にあつかわれるfbx形式で出力することができる点、アニメーションの設定ができる点が大きいのでしょう。
Unity / Blender 共に最新のバージョンによって値が変動している可能性があります。注意してください。
Metasequoiaは国産のモデリングツールで基本機能は無料で提供されています。ライセンスも5000円と非常に安く、日本国内のCG市場開拓を担ったソフトウェアと言えます。プラグインによってアニメーションの付与やfbx出力も可能になるので、選択肢として十分に考えられるソフトウェアです。
大きさの単位合わせ
Unityのグリッド線は単位当たり1メートルとして設定されているようです。初期状態で生成される"Cube"などは1立方メートルということになります。ところがBlenderからfbxで出力される標準的な立方体はサイズが異なるのでこのサイズを合わせる必要があります。
BlenderとUnityの標準的な縮尺比は50:1となっているようです。つまりBlenderから出力する際に50倍すればよいわけです。Blenderで辺の長さが50の立方体は、Unity上で辺の長さ1の立方体と同じ大きさとなります。ただしこの縮尺比はUnityのfbxファイルインポータが初期設定の場合です。詳細は続く注意書きと、項目"Unityのインポータでの解決"を確認してください。
これはUnityのfbxインポータの設定が初期状態の場合です。後に続く項目"Unityのインポータによる解決"で言及されますが、Unityに取り込む際に拡大縮小率を変更するパラメータ[Scale Factor]の初期値は0.01となっており、その場合の縮尺比が50倍となります。
Blenderから出力した他のフォーマットでは、倍率が50倍にはなっていません。例えばobj形式などは明らかにサイズが異なります。また他のツール、アプリケーションなどから出力されたfbx形式のファイルは縮尺比が異なる可能性が(大いに)あります。
- Referenceより
- Lightwaveでは縮尺比が100:1のようです(100m = Unituの1)。
- 3dsMaxでは縮尺比が100:1のようです(100cm = Unityの1)。
Scale係数の問題
多くのモデリングツールやCG関連のツールでこの問題が生じるため、ふつうは出力時に縮尺比を設定して出力することができるようになっています。Blenderにも同様の機能が与えられているのですが問題があります。それは出力時に設定する縮尺比の値がScaleの係数、Scaleの値としてモデル情報に与えられることです。
これが引き起こす問題は単純です。基本的な大きさ、つまり1単位当たりの大きさがそろっていないわけですから、プログラマや他のツールを利用してモデリングしている開発者はそれらを考慮する必要が出てくるのです。先のCubeを例にします。プログラマはUnity上で生成したCubeと、Blenderから(誤って)出力された立方体の大きさをプログラムによって制御します。そこでもしも"Scale=Vector3(1,1,1);"などとした場合には見た目の大きさが両者で異なってしまうのです。なぜならば、見かけ上の大きさは"Cube.Scale(1,1,1)"と"BlenderModel.Scale(50,50,50)"の時に一致するからです。
Unityのインポータによる解決
最も良く利用される方法はUnityのインポータの設定を利用する方法かもしれません。先に解説した問題もこの方法なら起こることはないでしょう。
アセットとしてfbxを取り込み、そのfbxを選択すると[Inspector(インスペクタ)ビュー]が[ImportSettings]になります。これはfbxファイルの取り込み方法を設定するためのメニューです。そこで項目[Meshes]の中に[ScaleFactor]が確認できるはずです(項目の一番上)。これは取り込むモデルを構成するメッシュのサイズをあらかじめ変更するための項目です。
初期値は0.01となっています。これは取り込み時にモデルのサイズを100分の1する設定ということになります。初期状態でBlenderとUnityの縮尺比は50:1であることが確認されていますが、実際にはfbxファイルを取り込む際に100分の1サイズに変更されていた、ということです。つまりBlenderから出力されるfbx形式のモデルの大きさと、Unity上の単位当たりの大きさの正確な縮尺比は、2:1 (= 1:0.5)となります。
ですから、"Blenderから各辺の長さが1、拡大縮小率を1として出力された立方体"を、"Unityの各辺1の立方体(Cube)"と同じサイズにする場合は、ScaleFactorの値を0.5に設定することになります。
図の上の立方体はUnity標準のCube、図の下の立方体はBlenderから各辺1、拡大縮小率1で出力した立方体です。ScaleFactorの値を0.5にしたとき、サイズが一致していることが確認できます。
チームで開発する場合などは、このScaleFactorの設定についてよく確認しておく必要があります。ScaleFactorが変更されていること、その値を周知しておくことで、縮尺比に関するトラブルを未然に防ぐことができるでしょう。
プログラマによる問題の解決
プログラマがモデルによって縮尺比が異なることを考慮してプログラミングすることでも問題を解決することはできます。つまりサイズの変更をする場合に、変更後の値を直接代入するのではなく、乗算することによって変更後の値を決定する方法です。先のCubeとの例を繰り返すと、"Scale=Vector3(2,2,2)"とするのではなく、"Scale *= 2"などとします。このようにすれば、サイズを2倍にする、という処理は見かけ上も適切な結果になります。それぞれ"Cube.Scale(2,2,2)"と"BlenderModel.Scale(100,100,100)"となるためです。
この方法によって問題を解決する場合には、チームで使用をよく確認して設計する必要があります。縮尺比が異なる現象が生じた場合に、プログラム記述の見かけ上は問題がないように見えるため、問題の原因特定が遅れるなどの危険性があるためです。問題を完全に防ぐことができないことも含めてトータルコストを考えると、この方法はあまり良い解決方法ではないと言えるでしょう。
モデラ(デザイナ)による問題の解決
Importerの設定値や、プログラマが考慮する値(あるいは単位)が気になる場合にはモデラが解決するしかありません。つまりモデリングする段階であらかじめ50倍(あるいは0.5倍)したサイズにしておくのです。モデリングをしていって最終的に拡大縮小によって50倍(0.5倍)する手もありますが、製作段階で直観的にモデルを作るには、グリッドの間隔を50倍(0.5倍)しておくことなどが良いと思われます。
BlenderとUnityの正確な縮尺比は2:1です。Unityのfbxインポータを設定する場合、Blenderであつかう倍率は変更される可能性があります。詳細については先の項目"Unityのインポータによる解決"を確認してください。特にImporterを設定しない場合は、50倍であつかいます。
- 設定手順
- [3Dビュー]の状態からメニュー項目[ビュー]を開き[プロパティ]を呼び出す。
- 表示されたプロパティウィンドウから項目[表示]を開き項目[グリッド]を確認する。
- [拡大縮小:1.000]を適切な値へ変更する(ここでは50.000ないし0.5倍とする)。
この手法は手堅く、プログラマやフィールドデザイナなどはモデルの大きさの違いについて考慮する必要がないため、最も良い解決法と言えるでしょう。複数人のモデラがチームにいる場合に、それぞれがUnity上の1単位当たりに合うようなモデルを出力するようにすれば、多くの場面でトラブルを防ぐことができるでしょう。他の手法を取る必要がある場合は、ダウンロードしてきたモデルを利用していて、モデリングツールが手元にない、ツールやモデリング自体の知識がない場合などと思われます(あるいは面倒になった場合だ)。
回転合わせ
2013.06.03追記。BlenderからFBXを出力するときには拡大縮小(Scale)だけではなく、回転(Rotate)の方が問題になることが多々あります。BlenderはCGをあつかうアプリケーションにしては珍しくZ方向が上を向いています。UnityはY軸が上です。BlenderのFBXエクスポータ(の多く)はエクスポート時にY軸を上に向けるように設定することができますが、これはRotate係数へ90度ないし、180度の値を与えるものです。したがって拡大縮小と同様の問題が発生してしまいます。Scaleの問題と違って厄介なのはUnityのアセットインポータには回転を指定するパラメータがないことです。
問題を解決するにはあらかじめモデルを回転した状態でfixし、エクスポート時に"Y軸を前方"、"Z軸を上"に設定するしかないと思われます。もちろんモデルを回転する方向によって、エクスポート時の設定は異なりますので、そこは手探りで調整してもらうしかないのですが。
Reference
- Unityマニュアル > ユーザガイド > アセットの使用 > メッシュ
- Unityオフィシャルの翻訳です。Unityの単位当たり1が物理空間中の1メートルとしてあつかわれていることが確認できます。
- Unity 3Dでスケールをあわせてみたよ - 3DNotes
- LightwaveとMaxでの大きさ合わせについて言及されています。