関連ブログ
- [UE4][UE5]開発環境の容量を少しでも減らす 2024.08.14UE
- [UE5] PushModel型のReplicationを使い、ネットワーク最適化を図る 2024.05.29UE
- [UE5]マテリアルでメッシュをスケールする方法 2024.01.17UE
CATEGORY
2017.12.02UE4UE/ Animation
今回はスケルトンについてまとめてみます。UE4のスケルトンは特殊なのでUE4でキャラクター周りを始めたばかりの人に読んでいただけると嬉しいです。
UE4のスケルトンは、名前は紛らわしいですが、キャラクターのボーン階層とは違ったものを意味します。
似たような用語にスケルタルメッシュというのがあるのですが、こちらはキャラクターのメッシュとそのメッシュ専用の骨、スキニングデータを意味します。これに対しスケルトンというのは、特定のモデルのボーン階層だけではなく、似たような構造を持つボーン階層の設定を包括したものということができます。公式サイトには以下のように記載されています。
重要な違いは、スケルトン アセットはスケルタル メッシュ内部のボーン階層とは異なることです。アンリアル エンジン 4 のスケルトン アセットは、 3D 表現の実際のスケルトンとは多少異なり、むしろ特定タイプのキャラクターやスケルタル メッシュのボーンや階層情報を保持するリストのようなものです。
なぜキャラクターごとにスケルトンを持つのではなく、異なるキャラクター同士でスケルトンを共有することが推奨されているのでしょうか?
たとえば、着せ替えができるゲームを想像してみてください。着せ替えしたモデルデータごとにスケルトンを作ると、モーションの数は着せ替えの組み合わせ分だけ掛け算することになります。また、体格こそ多少違うものの、そこまで重要ではない村人が何人も出てくるゲームを想像してみてください。スケルトンを共有しないと挨拶をするモーションを村人の数だけ用意することになります。
スケルトンを共有すると大きくは以下の利点があります。
ではどこまでボーン構造を変更したときに同じスケルトンとして共有できるのでしょうか。これには明確な基本ルールがあります。
これらのルールはインポート時のスケルトンに限ったことではなく、インポートしたスケルトンを共有してスケルタルメッシュを追加した場合、そのスケルタルメッシュのボーンも対象となります。
いくつか例をみてみましょう。
このサンプルでは女性のスケルトンと恐竜のスケルトンを共有しています。手足や背骨のボーンの名前こそ一緒ですが、全体的な大きさはもちろん、恐竜は尻尾のボーンを持っているためボーンが追加されています。さすがに女性と恐竜のモーションを共有することはあまりないと思いますが、このような場合でも同じスケルトンにすることができます。
つぎにエラーケースを見てみましょう。
恐竜のときと同じようにエイリアンの頭にボーンを追加して女性のスケルトンでインポートしてみます。
インポートするとエラーが出ました。
こちらはスケルトンの階層が変更される場合にでるエラーです。実はエイリアンには恐竜のときと同じくMayaのデフォルト名(joint1,joint2,joint3,joint4…)のままボーンを追加しています。一度スケルトンにスケルタルメッシュを追加すると、スケルトンにはなかったボーンが自動的に追加されます。恐竜をインポートした際にjoint1…はHipsの子として追加されました。
エイリアンをインポートするときに出たエラーは、joint1がHipsの子にあるのにHeadの子に移動したとみなされてしまったために起きたのですね(命名規則はしっかりしましょう)
スケルトンを共有する上で重要なのは、ボーンのTranslate(移動)をどう扱うかということです。公式サイトではこちらのページの内容です。スケルトン設定のタブの下の文字を選択肢、Show Retargeting Optionsを選択すると現在の設定を確認できます。
大きさの異なるキャラクターでスケルトンを共有した例を思い浮かべて下さい。大きさが違くてもモーションは使いまわせるのですが、大きさが違うということはボーンの位置が異なります。ボーンの位置が異なっているのにアニメーションでボーンの移動情報を参照すると、キャラクターのもとの大きさにかかわらずアニメーションの位置までボーンが移動してしまいます。
これでは普通は使いまわせませんので、殆どのボーンは「Skeleton」の設定にする必要があります(用語が混乱していますが、ここでのSkeletonは各キャラクターのボーン情報のことで、アセットとしてのSkeletonではありません)
ただし例外があり、移動による動きの大きさも考慮してほしいので、モーションの中で実際に移動するボーンは「AnimationScaled」にする必要があります。
すべてのボーンを「Skeleton」に設定すると、アニメーションの移動を読んでくれないのでこのような動きになります。
多くのボーンの階層構造では腰の骨を「AnimationScaled」、それ以外の骨を「Skeleton」にするといいでしょう。