[ue4]ボーンアニメーションの再利用 MMDモデル編

  • 29
    Like
  • 0
    Comment
More than 1 year has passed since last update.

【前提】

・Unreal Engine 4.9.2の使用を前提に記述しています。ただし、現時点(2015/12/20)の最新版の4.10.1でも同様に動作します
・うそを書くつもりはありませんが、私の使用経験に基づいて記述しているため、間違いが多分にある可能性があります
・私の環境がWindowsなのでWindows環境前提です
・できる限り初心者前提で書くつもりです
・twitterのアンケートでMMDのモデルに関心がある率が高かったためMMDのモデルを前提に再利用を説明します
・MikuMikuDanceはこちらです
http://www.geocities.jp/higuchuu4/
・ニコニコ立体さんはこちらです
http://3d.nicovideo.jp/works/td14712

・【超重要】MikuMikuDanceのモデルは、MikuMikuDanceで使用される(レンダリング)ことを前提として作成されているものが多く、他の環境での使用を前提としていないため、モデラーさんによっては他の環境での使用を控えるよう注意書きをされている場合があります
 【超重要】他のMMDモデル用に作成されている他人のモデルを使用される場合は、作者さんが作成されているReadMe等を熟読し、モデルをお借りしているのだという意識の元で自己判断での使用をお願いします
・MMDモデルの読み込みは、当記事の前提記事をお読みください
http://qiita.com/housakusleeping/items/4e171f2ab9a1805c4e77

・各httpのリンクを開く場合はブラウザの右クリックから「新しいタグで開く」が便利です
・手順に使用されている画像が小さくて見づらい場合が画像をクリックしてください。大きくなります

【目的】

UE4でプレイヤーのキャラクタのゲーム内アニメーションをグレーマン先生(ブルーマン先生)等のプロトタイプから
変更する方法を解説します。

【モーションのリターゲット】

【骨】

人体のモーション(アニメーション)を再利用する場合、3Dモデルの骨の構造を理解することは重要です。
通常、3Dモデルの骨のことをボーン(Bone)と呼びます。
ボーンは回転、移動等を行って3Dモデルを曲げたり移動させたりする場合に使用します。

【主要な部位】

異なるボーン構造をもったモーションをリターゲット機能を利用してモーションを変換して再利用する場合

人体の以下の部分の骨の名称が重要になります。

・頭
・首
・肩(左右)
・上腕(左右)
・前腕(左右)
・手首(左右)
・背中
・腰
・大腿(左右)
・下腿(左右)
・足首(左右)

手の指として
・親指(左右)
・人差し指(左右)
・中指(左右)
・薬指(左右)
・小指(左右)

これらの部分の骨の位置と名称が重要になります。
簡単ではありますがwikipediaに骨の名前が書かれています参照ください
https://ja.wikipedia.org/wiki/%E4%BA%BA%E9%96%93%E3%81%AE%E9%AA%A8%E3%81%AE%E4%B8%80%E8%A6%A7

【ue4の標準ボーン】

ue4の標準ボーンと思われるこのキャラクタのボーン構造を、まず、理解することから始めます。

ue4のテンプレート等で使用されている人体キャラクタモデルです。
2.jpg

このモデルのボーン構造はこうなっています。
1.jpg

手の指の骨はこうです
3.jpg

これを上記した主要な部位に当てはめると

・頭
head
・首
neck_01
・肩(左右)
clavicle_l 左
clavicle_r 右
・上腕(左右)
upperarm_l 左
upperarm_r 右
・前腕(左右)
lowerarm_l 左
lowerarm_r 右
・手首(左右)
hand_l 左
hand_r 右
・背中
spline_01
spline_02
spline_03
・腰
pelvis
・大腿(左右)
thigh_l 左
thigh_r 右
・下腿(左右)
calf_l 左
calf_r 右
・足首(左右)
foot_l 左
foot_r 右

手の指として
・親指(左右)
thumb_01_l 左手
thumb_02_l
thumb_03_l

thumb_01_r 右手
thumb_02_r
thumb_03_r

・人差し指(左右)
index_01_l 左手
index_02_l
index_03_l

index_01_r 右手
index_02_r
index_03_r

・中指(左右)
middle_01_l 左手
middle_02_l
middle_03_l

middle_01_r 右手
middle_02_r
middle_03_r

・薬指(左右)
ring_01_l 右手
ring_02_l
ring_03_l

ring_01_l 左手
ring_02_l
ring_03_l

・小指(左右)
pinky_01_l 左手
pinky_02_l
pinky_03_l

pinky_01_r 右手
pinky_02_l
pinky_03_l

となります。

この辺りの骨の命名は、命名する人によってもツールによっても違いますので注意が必要です。
ue4の標準構造の命名規約がこうなっていると言うことです。
(_l _r等の左右の名前の付け方も前だったリ後ろだったりします)

例えば、指などの名称も

■ 親指:Thumb
■ 人差し指:Pointer Finger, Index Finger, Forefinger, First Finger,
■ 中指:Middle Finger, Long Finger, Second finger,
■ 薬指:Ring Finger, Third Finger
■ 小指:Little Finger, Pinkie, Pinky, Fourth Finger

のように様々な名称付けがされている場合がありますので、他のツール(他の人)で作成したボーンの構造には注意が必要です。
当然ですが、腰などの他部位に関しても同じことが言えます。

【MMDの標準ボーン】

MMDのモデルであるpmxのニコニコ立体さんのモデルです

24.jpg

骨の構造はこうなっています。
22.jpg

手の指の骨はこうです

23.jpg

次にMikuMikuDanceのモデルの保存形式であるpmd,pmxの標準ボーンを上記の主要部位に当てはめると

・頭

・首

・肩(左右)
左肩
右肩
・上腕(左右)
左腕
右腕
・前腕(左右)
左ひじ
右ひじ
・手首(左右)
左手首
右手首
・背中
下半身
上半身1
上半身2
・腰

・大腿(左右)
左足
右足
・下腿(左右)
左ひざ
右ひざ
・足首(左右)
左足首
右足首

手の指として
・親指(左右)
左親指0
左親指1
左親指2

右親指0
右親指1
右親指2

・人差し指(左右)
左人差1
左人差2
左人差3

右人差1
右人差2
右人差3

・中指(左右)
左中指1
左中指2
左中指3

右中指1
右中指2
右中指3

・薬指(左右)
左薬指1
左薬指2
左薬指3

右薬指1
右薬指2
右薬指3

・小指(左右)
左小指1
左小指2
左小指3

左小指1
左小指2
左小指3

【ボーンの対応表】

骨の部位(ベース) ue4標準ボーン MMD標準ボーン
head
neck_01
肩(左) clavicle_l 左肩
肩(右) clavicle_r 右肩
上腕(左) upperarm_l 左腕
上腕(右) upperarm_r 右腕
前腕(左) lowerarm_l 左ひじ
前腕(右) lowerarm_r 右ひじ
手首(左) hand_l 左手首
手首(右) hand_r 右手首
背中1 spline_01 下半身
背中2 spline_02 上半身1
背中3 spline_03 上半身2
pelvis
大腿(左) thigh_l 左足
大腿(右) thigh_r 右足
下腿(左) calf_l 左ひざ
下腿(右) calf_r 右ひざ
足首(左) foot_l 左足首
足首(右) foot_r 右足首
骨の部位(詳細設定) ue4標準ボーン MMD標準ボーン
親指(左1) thumb_01_l 左親指0
親指(左2) thumb_02_l 左親指1
親指(左3) thumb_03_l 左親指2
親指(右1) thumb_01_r 右親指0
親指(右2) thumb_02_r 右親指1
親指(右3) thumb_03_r 右親指2
人差し指(左1) index_01_l 左人差1
人差し指(左2) index_02_l 左人差2
人差し指(左3) index_03_l 左人差3
人差し指(右1) index_01_r 右人差1
人差し指(右2) index_02_r 右人差2
人差し指(右3) index_03_r 右人差3
中指(左1) middle_01_l 左中指1
中指(左2) middle_02_l 左中指2
中指(左3) middle_03_l 左中指3
中指(右1) middle_01_r 右中指1
中指(右2) middle_02_r 右中指2
中指(右3) middle_03_r 右中指3
薬指(左1) ring_01_l 左薬指1
薬指(左2) ring_02_l 左薬指2
薬指(左3) ring_03_l 左薬指3
薬指(右1) ring_01_r 右薬指1
薬指(右2) ring_02_r 右薬指2
薬指(右3) ring_03_r 右薬指3
小指(左1) pinky_01_l 左小指1
小指(左2) pinky_02_l 左小指2
小指(左3) pinky_03_l 左小指3
小指(右1) pinky_01_r 右小指1
小指(右2) pinky_02_r 右小指2
小指(右3) pinky_03_r 右小指3

【MMDのモデル読み込みプラグイン導入】

こちらの記事を確認して、ニコニコ立体さんをue4に持ってきてください。
http://qiita.com/housakusleeping/items/4e171f2ab9a1805c4e77

【モーションリターゲット】

異なるボーンのモーションのリターゲットには大きく2つの方法があります。
1)ue4の標準リグ(ボーンではない)を使用する方法
2)異なるボーンのスケルタルメッシュのどちらかをリグ化する方法

1)ue4の標準リグ(ボーンではない)を使用する方法

1 ue4標準ボーンのリグ登録

まず、ue4の標準ボーンをリターゲットするために設定します。

スケルトンをダブルクリックします。
32.jpg

次にリターゲットマネージャを開きます。
33.jpg

リターゲットマネージャです
34.jpg

ue4の標準リグを選択するため
リグの選択画面で「ヒューマノイドリグを選択」をクリックします
35.jpg

下記のようにリグとボーンが同じ名称であるため、勝手に紐づけされ設定されます。
ue4の標準リグにはue4の標準ボーンと同じものが紐づけされています。
36.jpg

体の部分です。
37.jpg

手の指も勝手に紐づきます
38.jpg

「ポーズを表示」ボタンをクリックしモデルのスタンスを確認します。
39.jpg

以下のように確認画面が出ますので、モデルのリセット時の、AスタンスTスタンス等を必ず確認します。
40.jpg

また、ここで指や腕、足等々曲がっている等の問題があるとリターゲットが上手く実行できないため
ここで修正できるものは修正します。

以下の例は方の角度を修正しAスタンスからTスタンスに変更する例です。
41.jpg

ue4の標準ボーンの場合は特に何も修正が必要ないので、そのまま「ポーズの保存」ボタンをクリックします。
42.jpg

2 MMDモデルのリグ登録
ニコニコ立体さんのスケルトンをダブルクリックします
2.jpg

リターゲーットマネージャを起動します
1.jpg

ue4の標準リグを選択するため
リグの選択画面で「ヒューマノイドリグを選択」をクリックします
3.jpg

【ボーンの対応表】を参考に、ue4の標準リグにMMDのボーンを紐づけていきます。

25.jpg

「詳細設定を表示」をクリックし指の設定画面を開きます。
26.jpg

左手です
27.jpg

右手です
28.jpg

ボーンの設定が終わったら「ポーズを表示」ボタンでスタンスを確認します。
29.jpg

以下のようにモデルの元となるポーズが表示されます。
30.jpg

ここで注意するべきは、モデルのTスタンスとAスタンスの違いです。
(後述します)
ただし、ue4標準ボーンとMMD標準ボーンは同様にAスタンスであり特に確認は必要ありません。
ですので、このまま「ポーズを保存」ボタンをクリックします。
31.jpg

次の【モーションの変換コピー】に進めます。

2)異なるボーンのスケルタルメッシュのどちらかをリグ化する方法

ue4で標準に用意されている人型のリグであるhumanoidrigを使用せずに
自分でリグを指定する方法です。

例えばMMDのボーンをリグとして登録する方法です。
4.jpg

リグの元になるボーンを選択し、右クリックを押し「作成する」を選択後に「リグを作成」を選択します。
5.jpg
OKをクリックします

コンテンツブラウザ上に新しい「リグ」が追加されます。
6.jpg

新たなリグを作成すると、リターゲットマネージャのリグ選択画面で追加したリグが使用できるようになります。
7.jpg

これを適用すると以下のように今回追加したリグが変換の型になって、ここに各ボーンを紐づけていくことになります。
この方法を使った場合、リグの元になったボーンはそのままボーンが紐づけられるため便利です。
8.jpg

感の良い方は気付かれたかと思いますが
このリグを使用してue4の標準ボーンをこのリグに紐づける場合、先程の「1)ue4の標準リグ(ボーンではない)を使用する方法」に逆のことをやることになります。

つまり、ue4の標準ボーンをMMDの標準ボーンに紐づける作業が必要になります。

詳細は説明しませんが、みなさん試してみてください。

【モーションの変換コピー】

上記の異なるリターゲット設定が終わったら、モーションのリターゲットをしてみましょう。

とりあえず、試しに以下のアニメーションをMMDモデルにコピーしてみます。
9.jpg

コピーしてリターゲットしたいモーションを選択します
右クリックしメニューを開き「別のスケルトンのコピーを作成」を選択します。
10.jpg

以下のリターゲット画面が開きます
11.jpg

MMDのモデルを選択します
12.jpg

「選択」をクリックします
13.jpg

リターゲットが開始されコピーされたMMDのモデルのアニメーションが再生されます。

15.jpg

うまく行きました?

いえいえ、何かおかしくないですか?
14.jpg

明らかに手首の座標が狂っています。

【リターゲットの調整】

ここまでは、経験がなくてもある程度、クリアできる単純な手順です。
モーションのリターゲットで重要なのは、こういった不具合が起こったときに
トラブルを経験し、対処した経験の積み重ねによる調整です。

さて、なぜこのようなことが起こってしまったのか考えなければなりません。
一番、良いのは「なぜ?」と考えて色々なところを見直すことです

【リターゲットのトラブル】

よくあるトラブルの例の一覧を箇条書きしておきます

・Aスタンス、Tスタンスの誤り
 異なるボーンのリターゲットを行う場合、リターゲット元、リターゲット先でスタンスが違う場合
 どちらかのスタンスに合わせなければなりません

・余計なボーンの回転角度(rotation)が入っている
 異なるボーンのリターゲットを行う場合、できうる限り、各ボーンの回転角度は合わせる必要があります
 この例はよくおこります。そもそも、原理的にはAスタンス、Tスタンスの違いもこれが原因です。
 また、スタンスポーズ(元のポーズ)をよく見ると、実は指が曲がっていたり等々
 私も沢山経験しました。

・左と右を間違える
 これは単純にリグに登録するときに左のボーンと右のボーンを間違える場合です。
 私の経験上、指等の登録時に陥りがちです。

・そもそもリグのボーン登録を間違える
 リグを登録するとき対応するボーンを正しく登録していない、英語のボーンの場合ありがちです。

※「モーションリターゲットは一日にしてならずじゃ」by 猪熊滋悟郎

【この例の答え】

この、ue4の標準ボーンから、MMDの標準ボーンへのリターゲット時の答えは以下です。
(これですべて解決するとは限りません)

ue4の標準ボーンを開き、「ref pose」をクリックしてスタンスポーズ(大元のポーズ)を確認してみましょう。
0.jpg

この部分が明らかに回転(曲がって)しています。
16.jpg

次にMMDの標準ボーンを確認します。
まっすぐですよね
17.jpg

ここを合わせて、リターゲットしてみましょう。

ue4の標準ボーンの画面からリターゲットマネージャを起動しポーズを修正します。
リターゲットマネージャの「ポーズを表示」ボタンをクリックします
18.jpg

肘の部分のボーンに角度がついてしまっていますので、「-30」回転しできる限りまっすぐにします。
19.jpg

逆の腕も実施します。こちらは「+30」です。
20.jpg

修正したらポーズを保存をクリックし編集後のポーズを保存します
21.jpg

再度リターゲットしてみます。
22.jpg

大分、改善されたこと思います
23.jpg

この辺りの調整は、完全な正解がありません
よく見て、おかしいところを確認し調整していきましょう。

【プレイヤーキャラの入れ替え】

ここまで、異なるモーションのリターゲットがなんとなく上手くいくようになったら
ゲーム上のプレイヤーのキャラを入れ替えてみます。

例として、サードパーソンのテンプレートのキャラクタをMMDの標準ボーンに変えてみます。
24.jpg

サードパーソンのプロジェクト上に上記の方法でMMDモデルを読み込み
リターゲットでモーションのコピーが正しく行われるところまで実施しておきます。

【コントロール系の全てアニメーションのリターゲット】

プレイヤーキャラクタになっている「グレーマン先生」のボーンを選択し右クリックし、メニューを開きます
25.jpg

ここで「別のスケルトンへリターゲットする」を選択します

以下のダイアログがでますが「はい」をクリックします。
27.jpg

リターゲット画面が出るので対象を選択し
28.jpg

「選択」をクリックしリターゲットを行います。

この時点でエディタの「プレイ」ボタンを押しゲームを実行するとグレーマンがまったくアニメーションしなくなります。
29.jpg

次に元々、プレイヤーをコントロールしていた以下のアクターのブループリントをエディタで開きます
30.jpg

ブループリントを開いたら「ビューポートタグ」を開き「Mesh]を選択します。
31.jpg

ここが右の赤枠で示す通り「グレーマン」のままになっています。

ここをMMDモデルに変更します。
32.jpg

以下のようにアニメーションしていれば成功です。
33.jpg

ここで、MMDモデルがまったく動かずAスタンス等になっているようなら、どこかで間違っています。
上記をもう一度読み返し再挑戦してみてください。

上手くアニメーションされていたらブループリントをコンパイルします。
34.jpg

エディタに「プレイボタン」を押すとプレイヤーキャラクタが入れ替わり、アニメーションも適用されました。
35.jpg

なぜ、アニメーションのリターゲットだけでなくゲーム自体も問題ないかといいますと
この方法を使用すると
・アニメーション全て
・アニメーションブループリント(ステートマシンも)
・アニメーションブレンドスペース

の全てが新しいキャラクタに置き換わるからです。以下のように入れ替わっているはずです。

アニメーションブループリント
37.jpg

アニメーションブレンドスペース
38.jpg

【応用】

この手順の応用を行うと以下のような動画も簡単に作成可能です。

[ue4] A Girl and Her Kite [WIP]
https://www.youtube.com/watch?v=SynlYfasm-M

[ue4] A Boy and His Knife [He does not have a knife]
https://www.youtube.com/watch?v=30nkgEnGEoc

ゲームだとこんな感じ
[UE4]鷺宮カノさんに私のゲームに来て頂いた[中野シスターズ」
https://www.youtube.com/watch?v=8f38kkuDl20

【おまけ】

今回、このブログを作成するために作成した途中経過のプロジェクト
ニコニコ立体さんとグレーマンのリグの紐づけだけ行ったプロジェクトを以下に置いておきます
リターゲットを試してみたい方どうぞ

https://drive.google.com/file/d/0B-7H8IjwA4OyZlJMT29HNlJfa1E/view?usp=sharing

【最後に】

アニメーションデータの再利用は結構奥の深い分野です。
私のmotionbuilder使用時の頃からの経験からue4に置き換えて記述しています

モーションのリターゲットは、最終的には調整がすべてです。
この方法以外にも、モーションによるモデルのポリゴン抜け等に対処するために
加算キーを追加してモーション自体を修正することもあります。

みんさんもモーションを上手く再利用して、作成時間の節約をしましょう。

最後まで読んでいただきありがとうございました。

明日はみんな大好きue4の中の人、@junyash シモダさんです。

【追記 2016/01/10】

【ボーンの対応表 HumanIK】

骨の部位(ベース) ue4標準ボーン HumanIKボーン
head Head
neck_01 Neck
肩(左) clavicle_l LeftShoulder
肩(右) clavicle_r RightShoulder
上腕(左) upperarm_l LeftArm
上腕(右) upperarm_r RightArm
前腕(左) lowerarm_l LeftForeArm
前腕(右) lowerarm_r RightForeArm
手首(左) hand_l LeftHand
手首(右) hand_r RightHand
背中1 spline_01 Spine
背中2 spline_02 Spine1
背中3 spline_03 Spine2
pelvis Hips
大腿(左) thigh_l LeftUpLeg
大腿(右) thigh_r RightUpLeg
下腿(左) calf_l LeftLeg
下腿(右) calf_r RightLeg
足首(左) foot_l LeftFoot
足首(右) foot_r RightFoot

HumanIKの指は1~4まであるので4は含めない

骨の部位(詳細設定) ue4標準ボーン HumanIKボーン
親指(左1) thumb_01_l LeftHandThumb1
親指(左2) thumb_02_l LeftHandThumb2
親指(左3) thumb_03_l LeftHandThumb3
親指(左4) LeftHandThumb4
親指(右1) thumb_01_r RightHandThumb1
親指(右2) thumb_02_r RightHandThumb2
親指(右3) thumb_03_r RightHandThumb3
親指(右4) RightHandThumb4
人差し指(左1) index_01_l LeftHandIndex1
人差し指(左2) index_02_l LeftHandIndex2
人差し指(左3) index_03_l LeftHandIndex3
人差し指(左4) LeftHandIndex4
人差し指(右1) index_01_r RightHandIndex1
人差し指(右2) index_02_r RightHandIndex2
人差し指(右3) index_03_r RightHandIndex3
人差し指(右4) RightHandIndex4
中指(左1) middle_01_l LeftHandMiddle1
中指(左2) middle_02_l LeftHandMiddle2
中指(左3) middle_03_l LeftHandMiddle3
中指(左4) LeftHandMiddle4
中指(右1) middle_01_r RightHandMiddle1
中指(右2) middle_02_r RightHandMiddle2
中指(右3) middle_03_r RightHandMiddle3
中指(右4) RightHandMiddle4
薬指(左1) ring_01_l LeftHandRing1
薬指(左2) ring_02_l LeftHandRing2
薬指(左3) ring_03_l LeftHandRing3
薬指(左4) LeftHandRing4
薬指(右1) ring_01_r RightHandRing1
薬指(右2) ring_02_r RightHandRing2
薬指(右3) ring_03_r RightHandRing3
薬指(右4) RightHandRing4
小指(左1) pinky_01_l LeftHandPinky1
小指(左2) pinky_02_l LeftHandPinky2
小指(左3) pinky_03_l LeftHandPinky3
小指(左4) LeftHandPinky4
小指(右1) pinky_01_r RightHandPinky1
小指(右2) pinky_02_r RightHandPinky2
小指(右3) pinky_03_r RightHandPinky3
小指(右4) RightHandPinky4