LoginSignup
12
7

More than 5 years have passed since last update.

来るVRM黄金時代に備えてVRMキャラの身長差をどうにかしよう(withUnity)

Posted at

はじめに

VRM、来てますね。VRoidから始まりVカツ、カスタムキャストまでVRMに対応するらしく、アバターを簡単に自作出来る時代が目の前に迫っているって感じです。12月にはVroidHubもβ版が出るとか出ないとかなので(なんとVroid以外もVRM全般いけるらしい、太っ腹〜〜〜〜)マジで黄金時代来そうです。(執筆時12月中頃)
というわけで今回はVRMを使って自作したアバターを使えるようなアプリをUnityで自作する際に問題となる、「キャラごとの身長差」について考えてみようと思います。

VRMの身長差って?

VRMではヒューマノイドであること以外特にモデルの形状に制約はありません。つまり猫耳を生やしたり尻尾を付けたり小さい妖精さんを作ったり巨大娘を作ったりすることが出来るんですね。
ここで気になってくるのがキャラクタの身長です。例えば1.5mのキャラをターゲットに組んだゲームを5mのキャラや0.3mのキャラが遊ぶときにIKだったりワールドの大きさだったりカメラアングルだったりとかで様々な問題が出てきます。

じゃあどうするの

本当はそのキャラの身長を考慮してゲームシステムを分岐させた方がいいんですけど、今回はサイズを一定の範囲に保つ方法を考えてみようと思います。

どうやって実装しよう

Renderer.boundがあるじゃん

UnityのRendererコンポネントにはboundというモデルをすっぽり覆う最小の立方体に関する変数があります。
これを使えばキャラの身長を取ることができるんじゃないか?
確かにいいアイデアではありますが、ケモ耳の先っぽや天使の輪やアホ毛の一番上などまで図って計測すると骨格的には同じサイズでも頭の装飾品によって差が生まれ、頭に装飾品が付いていキャラは身長が小さめになってしまいます。結局不自然になってしまいそうですね。残念ながら没でしょう。

Humanoidの設定を使おう

VRMにはMecanimのモデル設定がHumanoidになっているのでAnimatorコンポネントから身体の各部位のボーンが取れます。
http://rinor.hatenablog.com/entry/2015/05/21/193216
ということは頭のボーンの位置と足のボーンの位置を取得してやって、補正をかけてやれば正確な身長が取得できそう… 実際にコードを書いてみましょう

コード

VRMSizeFixer.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class VRMSizeFixer : MonoBehaviour {
    public float minSize;//調整後の最小サイズ
    public float maxSize;//調整後の最大サイズ
    public GameObject VRMModel;//対象のモデル
    private Transform transSelf;
    private Animator anime;
    private Transform transHead;
    private Transform transFoot;
    private float defaultHeight;
    // Use this for initialization
    void Start () {
        anime = VRMModel.GetComponent<Animator>();
        transSelf = VRMModel.GetComponent<Transform>();
        transHead = anime.GetBoneTransform(HumanBodyBones.Head);
        transFoot = anime.GetBoneTransform(HumanBodyBones.RightFoot);
        defaultHeight = transHead.position.y - transFoot.position.y;
        Debug.Log(defaultHeight);
        if(defaultHeight < minSize)
        {
            float multiply = minSize / defaultHeight;
            transSelf.localScale = new Vector3(multiply, multiply, multiply);
        }else if(defaultHeight > maxSize)
        {
            float multiply = maxSize / defaultHeight;
            transSelf.localScale = new Vector3(multiply, multiply, multiply);

        }

    }

    // Update is called once per frame
    void Update () {

    }
}

VRMModelに身長調整の対象としたいVRMのモデルを設定してください。そこからHumanoidボーンの座標を得て一定の範囲の身長に押し込めています。これでうまく身長を設定することができそうです。

最後に

これでモデルを一定の身長に制限して意図したスケール感でコンテンツを作ることができそうです。あ、妖精さんフェチと巨大娘フェチの人ごめんなさい。この辺の調整はうまいことできるといいのですが…。VRMで推しの出てくるゲームをつくっていきましょう。以上。

12
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
7