Animator.humanScale の基準になっているモデルを探した話
はじめに
Humanoidなアニメーションをモデルに適用する際に、モデルの大きさ(Animator.humanScale)を考慮して補正しなければならない状況に遭遇しました。
Animator.humanScale = 1f なモデルにアニメーションを適用して補正後のアニメーションを評価したかったのですが、そもそもそんなモデルは存在するのか?と気になったので探してみました。
Animator.humanScale #とは
とりあえずUnity公式のリファレンスを読んでみましょう。困ったら公式リファレンスを読む、大切ですね。
ヒューマノイドリグでの、現在のアバターのスケールを返します(リグがジェネリックの場合、デフォルトは 1 です)
スケールは Unity のデフォルトアバターに対する相対的な大きさを示します。
Animator.humanScale - Unity スクリプトリファレンスより引用
この説明で分かったことは Unityのデフォルトアバター とやらが基準になっているモデルだということです。
Unityのデフォルトアバターというものは聞いたことありませんが、それっぽいものは何体か見たことあります。手当たり次第に調べていきましょう。
使用したスクリプト
今回使用した Animator.humanScale を数値として出力するスクリプトはこちらです。
public class HumanScaleVisualizer : MonoBehaviour { [SerializeField] private Animator targetAnimator; void Start() { Debug.LogFormat("{0}:{1}", targetAnimator.name, targetAnimator.humanScale); } }
Unity-Chan!
まずはお馴染みユニティちゃんから。
結果は 0.8847574。違うようです。
Ethan
Standard Assetsに入っている男性モデルのEthanはどうでしょう。
結果は 0.8713949。これも違う。
Space Robot Kyle
公式のサンプルシーンなどでよく見るSpace Robot Kyleはどうでしょう。
結果は 1.023291。うーん、これも違う…。
DefaultAvatar
ではAnimationClipなどの確認の際に出てくるDefaultAvatarはどうでしょう。名前的にもこれっぽいです。
結果は 1.02514。えっキミDefaultAvatarとかいう名前なのに、リファレンスの言うUnityのデフォルトアバターじゃないのね。
XBot
もうUnity公式のモデルは調べつくしました。今度は外部からモデルを持ってきましょう。
Adobeが運営しているmixamoというWEBサービスで配布されているXBotを検証してみましょう。
結果は 1.050318。違う…。
YBot
では同じサイトで配布されているYBotはどうでしょう。
結果は 1.035007。君も違うのか…。
お手上げ
正直言ってこれ以上探しても見つからない気がしてきました。Space Robot KyleのhumanScaleが1.023291と、誤差0.023291しかないのでほぼ基準として考えてもいいかもしれません。
とは言っても、ちゃんとしたとした基準がわからないのは何ともモヤモヤするものです。
どなたか知っている方がいらっしゃいましたらコメントなどで教えてくださると嬉しいです。
シィアニア王国 魔科学研究所より、愛と感謝を込めて。karukaruでした。
2019/08/30 追記
この記事を上げたところ、いろんな方から反応をいただきました。
特にユニティ・テクノロジーズ・ジャパンの小林信行さんからは大変重要な情報を教えていただきました。
この場を借りてお礼申し上げます。
間違ってるかもしれませんが、シーン単位がメートル設定の元でそのまま標準出力したHumanIKのスケルトンがそれのような気がしますね。恐らくこの値はリターゲットする時の基準値だと思いますので、だとしたら設計者の癖からしてMotionBilderと同じじゃないかなと思いますので。
— 小林信行 Nobuyuki Kobayashi (@nyaa_toraneko) February 23, 2019
もうひとつわかりましたが、HumanIKの標準スケルトンって、Hipジョイントの高さがちょうど1メートルの位置にあるみたいですね。Hipジョイントは全てのジョイントのルートですから、これが基準値になるのはよくわかります。問題になっている値は、スケルトンのHipジョイントの高さ比とも言えそうです。 pic.twitter.com/0CPSlAqCJD
— 小林信行 Nobuyuki Kobayashi (@nyaa_toraneko) February 23, 2019
ツイート文中にもありますが、Animator.humanScale の示す値は Hipジョイントの高さ比 として機能しているようです。
また Animator.humanScale = 1f なモデルは、デフォのHumanIKスケルトン であることもわかりました。
これを参考にアレコレすることでイイカンジにできそうですね!