Blender to UE4 (ver.2016)
この記事は、Unreal Engine 4 (UE4) Advent Calendar 2016 の 4 日目の記事です。
まず始めにですが、来年より UE4 専門会社として有名なあの会社にお世話になることになりました!試用期間中にあっさり切られないように頑張ります!
写真は山のようにいただいたお祝いの食べ物です。この他に書籍などもいただきました。ありがとうございます!
さて、『Blender で UE4 用 3D モデルを作って Import するまでに守るべきことまとめ』 という記事を書いてから 2 年弱になります。検索で上位に引っかかるらしく、未だに閲覧されることの多い記事なのですが、流石に内容が古くなってきたため、改訂版として本記事を書きたいと思……
……っていました。が、すみません!あまりにも遅筆過ぎる上に分量が多いため、記事が完成していません!残りは追々更新していくということで、書いてある部分だけ公開します!
スマヌ _(´ཀ`」 ∠)_
Blender 2.78a、Unreal Engine 4.13.2 を使用します。Blender の方は現段階での最新版ですが、Unreal Engine の方は最新版の 4.14.0 が自分の環境で安定しないため、1 つ前のバージョンを使用しています。
用語について
Blender と UE4 では同じような概念・機能・要素に対して違う言葉を使うことがありますので、先でまとめておきます。完全にイコールではない点に注意してください。
Blender での呼び方 | UE4 での呼び方 |
---|---|
Armature | Skeleton |
Action | Animation |
Shape Key | Morph Target |
『FBX 6.1 ASCII (A)』 ではなく 『FBX 7.4 binary (B)』 を選択する
Blender に標準搭載されている FBX Exporter では、書き出す FBX のバージョンを 『FBX 6.1 ASCII
』 と 『FBX 7.4 binary
』 の 2 種類から選択することができます。
以前の記事 では、「『FBX 7.4 binary
』 のメリットが確認できない上にデメリットがあるので、『FBX 6.1 ASCII
』 にしてください」と書きましたが、現在自分は 『FBX 7.4 binary
』 を利用しています。その理由について、これから書いていきます。
以下、『FBX 6.1 ASCII
』 による書き出しを 『A 書き出し』 または単に 『A』、『FBX 7.4 binary
』 による書き出しを 『B 書き出し』 または単に 『B』 と省略して呼ぶことにします。
ここで注意なのですが、例えば「A 書き出しでは○○のデータが書き出されない」と言った場合、それはあくまで「Blender で 『FBX 6.1 ASCII
』 オプションを選んだ場合の Export 処理に○○を書き出す処理が含まれていない」という話であって、「FBX 6.1 ASCII というファイルフォーマットが○○の書き出しに対応していない」という話ではありません。その点を留意した上でお読みください。
理由 1 : B はデフォルトで Mesh が正しい方向を向くため
B 書き出しにおいては、特に何も設定しなくても、Import された Mesh は正しい方向を向きます。
A 書き出しの場合、Export 側と Import 側の両方で適切な設定を行わないと、Mesh がうつ伏せに転倒します。しかも、その手法にいくつか問題があることがわかっています。
A において必要となる、Use T0As Ref Pose オプションを利用した Mesh の姿勢制御について
以前の記事 では、A 書き出しにおいて
- Blender での FBX Export 時に、座標系の
Forward
を-Z Forward
、Up
をY Up
に設定する - UE4 での FBX Import 時に、
Use T0As Ref Pose
を有効にする
とすることで、Skeletal Mesh と Animation Sequence の姿勢が正しく設定される、ということを書きました。
しかし、前述のとおり、この手法にはいくつか問題があります。以下で問題点を挙げていきます。
問題点 1 : Mesh の姿勢制御ができないソフトの併用時に別の対策が必要になる
上記手法は Export 側と Import 側の両方で設定を行う必要があるため、Substance Painter のような Mesh の姿勢制御ができないソフトを併用する場合、OBJ で書き出すなどファイルを別に用意する必要があり、管理が手間になります。
問題点 2 : Use T0As Ref Pose オプション有効時に法線の向きがおかしくなるケースがある
UE4 の FBX Import 設定にて Normal Import Method
を Import Normals and Tangents
にしている場合、Use T0As Ref Pose
を有効にして Skeletal Mesh の姿勢を変更すると、法線の向きがおかしくなるというバグが存在します 1。
以下の画像は、UE4 の Buffer Visualization Mode で表示させた World Normal の G-Buffer です。右側の Cube が、A で書き出して上記の設定で Import した Mesh です。左の Cube や床と比較すると、法線の向きが正しくないことがわかります。
理由 2 : B では Morph Curve を埋め込んだ Animation を書き出せるため
B 書き出しの場合、Blender 側で予め作成した Shape Key Animation を、Morph Curve として各 Animation Sequence に埋め込むことが可能です。
A 書き出しは Morph Curve の埋め込みに対応していないため、Import 後に UE4 側で Morph Curve を作成する必要があります。
Morph Curve とは?
UE4 では、Animation Sequence に対して Morph Curve と呼ばれるものを追加することができます。これを利用すると、Animation の再生中に Morph Target の値を変更することができます。
例えば、歩行 Animation に Curve を追加し、Curve 名を左目を閉じる Morph Target の名前と一致させ、…
… Curve Type を Morph Curve に設定し、縦軸 0.0 ~ 1.0 の範囲で適当に Key を打つと、…
… 以下のような感じで、歩行の Bone Animation に対して ウインクを行う Morph Target Animation を追加することができます。
以上のように、Morph Curve は UE4 上で作成することが可能なのですが、できればこういったものは Blender 側で作成しておいて、Export / Import すれば自動的に生成される、というのが理想です。B 書き出しではそれが可能となります。
Morph Curve の埋め込み方
Blender にて Driver を用いて Action と Shape Key Animation を連動させることで、B 書き出しの際に Animation Sequence に Morph Curve が埋め込まれるようになります。手順は以下のとおりです。
- Armature に対して Shape Key 操作用の Bone を作成する
- Shape Key に対して Driver を追加し、1 で作成した Bone の移動・回転・拡縮に合わせて値が変化するように設定する
- 1 で作成した Bone に Key を打って、Shape Key Animation を作成する
詳しくは naotaro さんのブログ記事を読んでください。
試しに 「手を振っている最中ににっこり笑う」 Action を作ってみました。頭の上に見える 3 本の線が Shape Key 操作用の Bone で、X 軸回転操作で対応する Shape Key の値が増減するような設定になっています。
これを B で書き出して UE4 に Import すると、以下のようになります。Morph Curve が自動で埋め込まれていることが確認できます。
理由 3 : A と B で UE4 Import 時の Bone 構造が同一になったため
Blender 2.73a の頃は、UE4 に Import した際の Bone 構造が A 書き出しと B 書き出しで異なっていました。しかし、2.78a ではこの差異がなくなったため、A か B かを選択する際にこの点を考慮する必要がなくなりました。
例えば、以下のようなモデルを FBX で書き出すとします。
Blender 2.73a にて A 書き出しを行い、UE4 に Import すると以下のようになります。Blender における Armature Object (Armature_Object
) が Root Bone の扱いになっており、本来の Root Bone であった RootBone_Bone
はその子になっています。
一方で、Blender 2.73a にて B 書き出しを行うと以下のようになります。RootBone_Bone
がそのまま Root Bone として扱われています。
このような差異があったのですが、Blender 2.78a では A・B どちらの場合でも Armature Object が Root Bone として扱われるようになっています。
Root Motion を付ける方法
さて、A と B で Bone 構造が同一となること自体はよいのですが、どちらの場合でも Armature Object が Root Bone として扱われるため、本来の Root Bone に Location の Key を打っても、UE4 上で Root Motion として扱われないという問題があります。
Root Motion を付けたい場合は、Pose Mode ではなく Object Mode にし、Armature Object の Location に Key を打つ必要があります。
UE4 Import 時の Bone 構造が今後変わる可能性について
GitHub の EpicGames/UnrealEngine リポジトリ に対して、Armature Object が Root Bone 扱いとなるのを修正する Pull Request が提出されており、今現在は Waiting For Review いう扱いになっています。
どうやら、FFbxImporter::GetRootSkeleton
メソッドが親 Bone を辿って Root Bone を見つける過程で、Attribute が Null の Node まで辿ってしまっているのが原因のようです (Armature Object の Attribute は Null)。
もしこの Pull Request が Merge された場合、普通に Root Bone の Location に Key を打てば Root Motion になるので、上で説明したテクニックは不要になります。
ただしその場合、Root Bone が複数存在する Armature は UE4 に Import することができなくなります。UE4 は単一 Root Bone のみをサポートしているので、親を設定していない Bone を 1 つにする必要があります。以下は、Root Bone を複数持つ FBX を UE4 に Import した際のエラーメッセージです。
以下、執筆中…
今後、以下のようなことを書いていく予定です。
- 『FBX 6.1 ASCII (A)』 ではなく 『FBX 7.4 binary (B)』 を選択する
- 理由 4 : B において発生するアニメーションのガタつき問題が対処可能であるため
- B 書き出し時のみ発生するアニメーションのガタつきを解決する方法の解説
- Visual Keying で Animation Bake した上で IK Constraint を無効にする
- NLA Editor を用いた書き出し対象 Action の選択およびトリミング方法の解説
- B 書き出し時のみ発生するアニメーションのガタつきを解決する方法の解説
- 理由 4 : B において発生するアニメーションのガタつき問題が対処可能であるため
- Scale 問題
- [この tweet](https://twitter.com/rarihoma/status/783868446815637509) のリプライチェーンで言っていることをまとめる
- Unit Scale Factor と Local Scaling について解説
- どのような操作で Unit Scale Factor や Local Scaling の値が変化するか
- Apply Unit Scale オプション有効
- Object の Scale 変更
- Units → Unit Scale 変更
- Apply Transform オプション有効
- 「Export / Import 時に Scale 100 倍」で発生する諸問題について
- どのような問題が発生するか
- Persona Animation Editor 上で Bone の回転がおかしくなる現象 (将来解決予定のバグ)
- Socket の Scale が 100 倍になる現象 (UE4 の仕様)
- 加算レイヤートラックの Curve による影響が 100 倍になる現象 (UE4 の仕様?)
- なぜ問題が発生するのか
- 各計算に Local Scaling の値が考慮されているから
- どのような問題が発生するか
- Scale 問題の発生しない FBX (Unit Scale Factor = 1, Local Scaling = 1, モデルのサイズ 100 倍) を作成するにはどうすればよいか
- 普通に作って Apply Transform をオンにする方法
- Animation が壊れる可能性あり
- Unit Scale = 0.01 にした状態で普通に作る
- 以下の問題がある
- Camera の Clipping 設定の変更などが必要
- 物理シミュが正しく動かない
- 1 m のものが 1 m 落ちる挙動と、100 m のものが 100 m 落ちる挙動は相似ではない
- 今後 Blender の Viewport が PBR 対応した場合に見た目がおかしくなる可能性がある
- 以下の問題がある
- 100 倍 Scale 0.01 の Empty を Armature の親にする
- 普通に作って Apply Transform をオンにする方法
- 余談 : Scale 変更によって壊れてしまった Action の直し方
- どのような操作で Unit Scale Factor や Local Scaling の値が変化するか
- Unit Scale Factor と Local Scaling について解説
- [この tweet](https://twitter.com/rarihoma/status/783868446815637509) のリプライチェーンで言っていることをまとめる
- Smoothing 問題
- どう設定すればよいのか
- 参考 : [Exporting Smoothing information from Blender via FBX — polycount](http://polycount.com/discussion/155012/exporting-smoothing-information-from-blender-via-fbx)
- Smooth にしたいところに Shade Smooth をかけ、それ以外は Shade Flat にする方法
- この方法では実現できない形状がある
- 全体を Shade Smooth にして Sharp にしたい Edge を Mark Sharp し Edge Split Modifier を適用
- 全体を Shade Smooth にして Sharp にしたい Edge を Mark Sharp し Auto Smooth をオンにする (angle = 180)
- Smooth にしたいところに Shade Smooth をかけ、それ以外は Shade Flat にする方法
- 参考 : [Exporting Smoothing information from Blender via FBX — polycount](http://polycount.com/discussion/155012/exporting-smoothing-information-from-blender-via-fbx)
- どう設定すればよいのか
- その他
- Skeletal Mesh の分割 Import は依然として必要
中途半端な形になってしまい申し訳ないのですが、ひとまずこれでバトンを繋ぎたいと思います。
明日は com04 さんの 「UE4 のセルシェード実装方法を纏めたい」 です。
- Unreal Engine Issues ではこのバグの Affect Versions は 4.11 と表記されていますが、自分が 第 3 回 UE4 ぷちコンに応募した 『はじけるタワーディフェンス!』 においてもこの現象に悩まされたので、UE 4.7 の時点で既に存在していたバグだと思われます。 ↩