BLOGブログ

2017.12.02UE4/Animation

[UE4] スケルトンについて

今回はスケルトンについてまとめてみます。UE4を始めたばかりの人に向けた内容です。

UE4のスケルトンとは何か

UE4のスケルトンは、名前は紛らわしいですが、キャラクターのボーン階層とは違ったものを意味します。
似たような用語にスケルタルメッシュというのがあるのですが、こちらはキャラクターのメッシュとそのメッシュ専用の骨、スキニングデータを意味します。これに対しスケルトンというのは、特定のモデルのボーン階層だけではなく、似たような構造を持つボーン階層の設定を包括したものということができます。公式サイトには以下のように記載されています。

重要な違いは、スケルトン アセットはスケルタル メッシュ内部のボーン階層とは異なることです。アンリアル エンジン 4 のスケルトン アセットは、 3D 表現の実際のスケルトンとは多少異なり、むしろ特定タイプのキャラクターやスケルタル メッシュのボーンや階層情報を保持するリストのようなものです。

スケルトンを共有するとどんな利点があるか?

なぜキャラクターごとにスケルトンを持つのではなく、異なるキャラクター同士でスケルトンを共有することが推奨されているのでしょうか?
たとえば、着せ替えができるゲームを想像してみてください。着せ替えしたモデルデータごとにスケルトンを作ると、モーションの数は着せ替えの組み合わせ分だけ掛け算することになります。また、体格こそ多少違うものの、そこまで重要ではない村人が何人も出てくるゲームを想像してみてください。スケルトンを共有しないと挨拶をするモーションを村人の数だけ用意することになります。

スケルトンを共有すると大きくは以下の利点があります。

  • AnimationSequence(モーション)を使いまわせる
    たとえ体型が異なるキャラクターでも同じ動きをさせることができます。
  • AnimationBlueprintやStateMaschineを使いまわせる
    StateMaschineとはざっくりいうと、キャラクターの状態に合わせてどんなモーションを流すかその遷移をしめしたものです。
    (例:キャラクターが地面に設置していなければ空中浮遊中のモーションを流す、キャラクターの移動速度に従って走りアニメーションの速度を変える、プログラムからキャラクターの死亡通知を受け取ったら断末魔のアニメーションを流す)
    こういった仕組みでキャラクターのアニメーションを管理する必要があるのですが、スケルトンが共通であればこの仕組も使いまわせます。

一つのスケルトンの中でどこまで変更可能か?

ではどこまでボーン構造を変更したときに同じスケルトンとして共有できるのでしょうか。これには明確な基本ルールがあります。

「階層の変更をともなう変更はできない」

  • ボーンの追加はOK(ただし、すでにスケルトンに存在するボーン同士の中間には禁止)
    既存のボーンの後ろにくっつけるようにボーンを追加するのは構いませんが、既存のボーンとボーンの間に新たに追加することは禁止されています。
  • ボーンの削除はOK(ただし、削除した場合はそれ以下のボーンをすべてなくす必要がある)
  • 同じ名前が別の階層に存在すると、変更とみなされる
    上記のルールと若干同じ内容ではあるのですが、追加ボーンがすでに同じ名前で異なる階層に存在している場合、ボーンの階層を変更したとみなされるため、これはできません。

これらのルールはインポート時のスケルトンに限ったことではなく、インポートしたスケルトンを共有してスケルタルメッシュを追加した場合、そのスケルタルメッシュのボーンも対象となります。

 

いくつか例をみてみましょう。

このサンプルでは女性のスケルトンと恐竜のスケルトンを共有しています。手足や背骨のボーンの名前こそ一緒ですが、全体的な大きさはもちろん、恐竜は尻尾のボーンを持っているためボーンが追加されています。さすがに女性と恐竜のモーションを共有することはあまりないと思いますが、このような場合でも同じスケルトンにすることができます。

 

つぎにエラーケースを見てみましょう。
恐竜のときと同じようにエイリアンの頭にボーンを追加して女性のスケルトンでインポートしてみます。

インポートするとエラーが出ました。

こちらはスケルトンの階層が変更される場合にでるエラーです。実はエイリアンには恐竜のときと同じくMayaのデフォルト名(joint1,joint2,joint3,joint4…)のままボーンを追加しています。一度スケルトンにスケルタルメッシュを追加すると、スケルトンにはなかったボーンが自動的に追加されます。恐竜をインポートした際にjoint1…はHipsの子として追加されました。

エイリアンをインポートするときに出たエラーは、joint1がHipsの子にあるのにHeadの子に移動したとみなされてしまったために起きたのですね(命名規則はしっかりしましょう)

スケルトンの設定

スケルトンを共有する上で重要なのは、ボーンのTranslate(移動)をどう扱うかということです。公式サイトではこちらのページの内容です。スケルトン設定のタブの下の文字を選択肢、Show Retargeting Optionsを選択すると現在の設定を確認できます。


大きさの異なるキャラクターでスケルトンを共有した例を思い浮かべて下さい。大きさが違くてもモーションは使いまわせるのですが、大きさが違うということはボーンの位置が異なります。ボーンの位置が異なっているのにアニメーションでボーンの移動情報を参照すると、キャラクターのもとの大きさにかかわらずアニメーションの位置までボーンが移動してしまいます。

これでは普通は使いまわせませんので、殆どのボーンは「Skeleton」の設定にする必要があります(用語が混乱していますが、ここでのSkeletonは各キャラクターのボーン情報のことで、アセットとしてのSkeletonではありません)
ただし例外があり、移動による動きの大きさも考慮してほしいので、モーションの中で実際に移動するボーンは「AnimationScaled」にする必要があります。

すべてのボーンを「Skeleton」に設定すると、アニメーションの移動を読んでくれないのでこのような動きになります。


多くのボーンの階層構造では腰の骨を「AnimationScaled」、それ以外の骨を「Skeleton」にするといいでしょう。