画像から 3D の模型を起こす Pixal3D で作った、検証用に用意した人物(約 2.6 頭身)に Mixamo の動きを付けて、Unity で動かせるかを技術検証しました。12,000 三角形・骨付きの人物に動きを付けるところまではできましたが、見た目は粗いままで、成功とは言いがたい出来でした。

この記事は、その途中の動きを写す段で詰まった話です。Mixamo の標準の骨格向けの動きをそのまま写すと、大きな頭と靴のせいで、足が床に潜ったり、体が浮いたり、顔が隠れたりしました。

結論

  • Mixamo からは骨だけの動き(Without Skin・30fps・Keyframe Reduction none)を落とし、Blender で骨ごとに「休みの姿勢からの、世界での回転の差」を毎コマ写しました。
  • 腰の動きは脚(股から足首)の長さの比で縮め、床合わせはクリップ全体で一定の量にすると、歩きで足が床に着くコマが増えました。ただ、振り出しと蹴り出しで、靴のつま先は最大 7.4cm 潜ったままでした。
  • 首と頭の回転は 0.2 に弱め、上腕の上げ角は水平から 25° までに抑えると、顔を隠す崩れが無くなりました。ただ、応援の手が頭の高さまでしか上がらない点は残りました。

試した環境

  • Mixamo:Walking(In Place)・Happy Idle・Cheering。応援には Victory と Excited も比べた
  • Blender:骨を付けた人物に、スクリプトで動きを写す
  • Unity 6:Legacy Animation、縮尺 1、ループで取り込む
  • 人物:約 2.6 頭身、12,000 三角形、Mixamo と同じ名前の骨 25 本。40〜60px ほどの小さな表示と、見下ろしのカメラを想定

骨だけの動きを落として、Blender で写す

人物ごとに Mixamo の画面で骨を入れる作業が要らないように、骨は Blender のスクリプトで付け、Mixamo からは標準の骨格に付いた「骨だけ」の動きを落としました。

Mixamo の書き出しの設定。FBX Binary、Without Skin、30fps、Keyframe Reduction none

項目値
FormatFBX Binary
SkinWithout Skin
Frames per Second30
Keyframe Reductionnone
歩きの動きIn Place にする

新しいタブで開くと Skin が With Skin に戻るので、落とすたびに確かめる必要がありました。Blender に読むと、骨の名前は mixamorig: で始まり、休みの姿勢は T ポーズ、正面は -Y です。

写すときは、骨ごとに「休みの姿勢からの、世界での回転の差」を毎コマ写しました。こうすると、Mixamo の骨と自分で置いた骨とで軸の向きが違っても崩れません。A ポーズで骨を置いた人物に写すときは、さらに腕の骨の休みの向きを直す必要がありました。

足が床に潜る・体が浮く

腰の位置の動きは、骨格の大きさに合わせて縮めて写しました。最初は腰の高さの比(0.4738)で縮めましたが、2.6 頭身の人物は靴が大きく脚が短いので、これだと足が床に潜りました。脚(股から足首)の長さの比(0.2716)で縮めるように変えました。

床合わせも変えました。最初は毎コマ、模型の一番低い点を床に付けていました。床合わせを切って歩きの各コマを測ると、休みの足首の高さ 0.184 に対し、支えの足首は 0.187〜0.20 で床の上にありました。一番低い点は体の後ろ(y が +0.06〜+0.18)にある、蹴り出した足のつま先で、最大で -0.06 まで下がっていました。毎コマ一番低い点を床に付けると、このつま先に合わせて体ごと浮き、支えの足が床から離れます。

そこで、床合わせの量をクリップ全体で一定にしました。量は、支えの足首が休みの高さになるように決めます。歩きでは -1.36cm でした。

腰の縮め方床合わせ測った値
腰の高さの比毎コマ床合わせの量 0.17〜7.9cm
脚の長さの比毎コマ床合わせの量 -0.2〜6.0cm
脚の長さの比一定(-1.36cm)一番低い所 -7.4〜-1.1cm

毎コマの床合わせでは各足 5・6 コマ、一定の床合わせでは 14・22 コマ

歩き(30 コマ)で足が床に着いていたコマは、毎コマの床合わせでは各足 5・6 コマでしたが、一定にすると 14・22 コマに増えました。

つま先の潜りを指の付け根の骨で直す方法も試しました。宙にある足まで直してしまい、コマの間で 84° 跳ね、ループの継ぎ目も 47° になったので外しました。振り出しと蹴り出しで、靴のつま先は最大 7.4cm 潜ったままでした。人物の高さの 3%、想定した表示で約 1.5px です。

つま先が床に少し沈んだまま歩く頭の大きな人形

顔が髪に隠れる・拳が顔を覆う

歩きでは、首と頭の回転をそのまま写すと、前傾で顔が髪に隠れ、見下ろしのカメラでは顔が見えなくなりました。首と頭の回転を、まず 0.5 に、その後 0.2 まで弱めました。

応援の Cheering では、拳が顔を覆いました。Mixamo の Victory と Excited を足して比べると、Victory は腕が大きな頭の後ろに隠れ、Excited は手が上がらず跳ねませんでした。

Victory をそのまま写した人物。上げた腕が大きな頭の後ろに隠れている

Victory を使い、上腕の上げ角を水平から 50° まで、その後 25° までに抑えました。Victory は Mixamo の画面で Arm Height と Excitement を 100、Body Twist を 0、Character Arm-Space を 100 にして落としました。

上腕の上げ角を 25° までに抑えた Victory。腕が頭に隠れない

これで顔を隠す崩れは無くなりましたが、応援の手が頭の高さまでしか上がらない点は残りました。

最後の版で測った値

クリップ長さループの継ぎ目の回転普段の1コマの回転
歩き1.000 秒15.38°14.75°(最大 24.2°)
待機1.967 秒0.96°0.60°
応援5.533 秒1.73°1.73°

歩きと応援では、継ぎ目の回転が普段の1コマとほぼ同じでした。歩きの左足は 9〜25 コマで y が -0.153 から +0.114 へ、平均 0.50/秒で後ろへ動きました。Unity では 12,000 三角形・骨 25 本・3クリップの人物として、Legacy のループで読めました。

確かめていないこと

  • つま先の最大 7.4cm の潜りが、想定した表示で見えるかは確かめていません。直すなら、脚の曲げ(IK)から作り直すことになります。
  • 2.6 頭身で読める応援(跳ねる・手をたたく)が、Mixamo のほかの動きにあるかは確かめていません。
  • 実機での見え方と負荷は確かめていません。

おわりに

頭身の違う人物に Mixamo の動きを写すと、崩れは大きな頭と靴のまわりに集まりました。腰の縮め方と床合わせの決め方を変え、首・頭・腕を弱めて、歩き・待機・応援の3つの動きは付けられました。ただ、つま先の潜りと、応援の手が頭の高さまでしか上がらない点は残り、人物の見た目も粗いままでした。

※ Mixamo の画面の設定と振る舞いは執筆時点の物で、いまは変わっている可能性があります。