rarilog

主にゲーム制作に関することを書いていきます

2016/12/04 : Blender UnrealEngine

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 ForwardUpY 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 MethodImport 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 が埋め込まれるようになります。手順は以下のとおりです。

  1. Armature に対して Shape Key 操作用の Bone を作成する
  2. Shape Key に対して Driver を追加し、1 で作成した Bone の移動・回転・拡縮に合わせて値が変化するように設定する
  3. 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 の選択およびトリミング方法の解説
  • Scale 問題
    • この tweet のリプライチェーンで言っていることをまとめる
      • 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 倍) を作成するにはどうすればよいか
        1. 普通に作って Apply Transform をオンにする方法
          • Animation が壊れる可能性あり
        2. Unit Scale = 0.01 にした状態で普通に作る
          • 以下の問題がある
            • Camera の Clipping 設定の変更などが必要
            • 物理シミュが正しく動かない
              • 1 m のものが 1 m 落ちる挙動と、100 m のものが 100 m 落ちる挙動は相似ではない
            • 今後 Blender の Viewport が PBR 対応した場合に見た目がおかしくなる可能性がある
        3. 100 倍 Scale 0.01 の Empty を Armature の親にする
      • 余談 : Scale 変更によって壊れてしまった Action の直し方
  • Smoothing 問題
    • どう設定すればよいのか
      • 参考 : Exporting Smoothing information from Blender via FBX — polycount
        1. Smooth にしたいところに Shade Smooth をかけ、それ以外は Shade Flat にする方法
          • この方法では実現できない形状がある
        2. 全体を Shade Smooth にして Sharp にしたい Edge を Mark Sharp し Edge Split Modifier を適用
        3. 全体を Shade Smooth にして Sharp にしたい Edge を Mark Sharp し Auto Smooth をオンにする (angle = 180)
  • その他
    • Skeletal Mesh の分割 Import は依然として必要

中途半端な形になってしまい申し訳ないのですが、ひとまずこれでバトンを繋ぎたいと思います。

明日は com04 さんの 「UE4 のセルシェード実装方法を纏めたい」 です。

  1. Unreal Engine Issues ではこのバグの Affect Versions は 4.11 と表記されていますが、自分が 第 3 回 UE4 ぷちコンに応募した 『はじけるタワーディフェンス!』 においてもこの現象に悩まされたので、UE 4.7 の時点で既に存在していたバグだと思われます。