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。違うようです。
f:id:karukaru808:20190223010319p:plain

Ethan

Standard Assetsに入っている男性モデルのEthanはどうでしょう。
結果は 0.8713949。これも違う。
f:id:karukaru808:20190223010345p:plain

Space Robot Kyle

公式のサンプルシーンなどでよく見るSpace Robot Kyleはどうでしょう。
結果は 1.023291。うーん、これも違う…。
f:id:karukaru808:20190223010454p:plain

DefaultAvatar

ではAnimationClipなどの確認の際に出てくるDefaultAvatarはどうでしょう。名前的にもこれっぽいです。
結果は 1.02514。えっキミDefaultAvatarとかいう名前なのに、リファレンスの言うUnityのデフォルトアバターじゃないのね。
f:id:karukaru808:20190223010642p:plain

XBot

もうUnity公式のモデルは調べつくしました。今度は外部からモデルを持ってきましょう。
Adobeが運営しているmixamoというWEBサービスで配布されているXBotを検証してみましょう。
結果は 1.050318。違う…。
f:id:karukaru808:20190223010709p:plain

YBot

では同じサイトで配布されているYBotはどうでしょう。
結果は 1.035007。君も違うのか…。 f:id:karukaru808:20190223010723p:plain

お手上げ

正直言ってこれ以上探しても見つからない気がしてきました。Space Robot KyleのhumanScaleが1.023291と、誤差0.023291しかないのでほぼ基準として考えてもいいかもしれません。

とは言っても、ちゃんとしたとした基準がわからないのは何ともモヤモヤするものです。
どなたか知っている方がいらっしゃいましたらコメントなどで教えてくださると嬉しいです。

シィアニア王国 魔科学研究所より、愛と感謝を込めて。karukaruでした。

2019/08/30 追記

この記事を上げたところ、いろんな方から反応をいただきました。
特にユニティ・テクノロジーズ・ジャパンの小林信行さんからは大変重要な情報を教えていただきました。
この場を借りてお礼申し上げます。

ツイート文中にもありますが、Animator.humanScale の示す値は Hipジョイントの高さ比 として機能しているようです。
また Animator.humanScale = 1f なモデルは、デフォのHumanIKスケルト であることもわかりました。

これを参考にアレコレすることでイイカンジにできそうですね!