ぶろぐめんどくさい

技術系の記事と漫画レビューが入り混じった混沌

VRコスプレでキャリブレーションするスクリプト

2018/05/04 16:07 スクリプト修正

UNITYを使って、VRコスプレでユニティちゃんになりきるものを作りました。 使ったアセットは定番のFinal IK(ようやく買えた)です。

VRコスプレを初めてしてみて、モデルとの身長差が気になりました。 私の身長は175cmに対して、ユニティちゃんの身長は200cm。 25cmの差だけ視点がユニティちゃんの頭上に突き抜けたり、カメラの位置が低すぎてユニティちゃんがコマネチをしたりと大変だったのです。 前者はまだいいのですが、後者はポージングに影響がでるため絶対に避けたい問題。 この身長差を埋めるために、キャリブレーションをする必要がありました。

キャリブレーションには(おそらく)2通りの方法があります。

  1. モデルのスケールを変更
  2. モデルの視点とカメラの位置を合わせる

1番目は、モデルのスケールを変更して自分の体格と合わせようという方法です。 「VRIK キャリブレーション」とぐぐると一番にヒットする対処法がこれです。 2番目は、カメラの位置を調整して、モデルの目の位置に持ってくればいいじゃないというものです。 VRは立位、立って遊ぶことがほとんどです。 そのため、VRコスプレでは、直立姿勢でモデルの顔の位置にカメラをもってくることが望ましい。 そこで、ユーザが直立した状態でカメラの位置を調整することで、これを解決します。

1番目の方法は、モデルのスケールが変化してしまいます。 せっかく、等身大(といっても2mありますが)のモデルがあるのですから、スケールはなるべく崩したくない。 ですので、私は2番目の方法で身長差の解決を測りました。

方法を説明します。といっても方法は単純です。 [CameraRig]オブジェクトの高さを変更するだけ。

[CameraRig]はトラッキングの高さを指定することができます。 ですので[CameraRig]の高さをモデルの身長に応じて、変更すれば良いのです。 具体的にはTransformプロパティのpositionのy座標を適当な値に変更すること。それだけです。

試行錯誤的にプロパティをいじっても良いのですが、せっかくなのでプログラミングで解決したい問題です。 そこで、以下のスクリプトを書きました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Calibrator : MonoBehaviour {

    /**
    * カメラリグのオブジェクト
    */
    [SerializeField]
    Transform cameraRig;

    /**
    * カメラオブジェクト 
    */
    [SerializeField]
    Transform hmdEye;

    /**
    * モデルの高さ
    */
    [SerializeField, Range(0f, 3.0f)]
    float charaHeight;

    /**
    * キャリブレーション 
    */
    public void Calibrate () {
        float height =  charaHeight - hmdEye.transform.localPosition.y;
        cameraRig.position = new Vector3 (0, height, 0);
    }

}

このスクリプトでやっていることは、 単純にカメラリグの位置を、モデルと自分との身長差で調整しているだけです。 その際にカメラの位置を使って、自分の身長を測定しています。(正確には目の高さですが)

直立姿勢でこのスクリプトのCalibrateを実行することで、 モデルと自分の身長差を埋めることができます。 私はviveコントローラーのトリガーを引いたときにSendMessageを送り、Calibrateを実行するようにしました。

使用したヒエラルキーはこれです。

f:id:be116:20180504145915p:plain

空のゲームオブジェクトを作ってCallibratorを追加し、 cameraRigに[CameraRig]、hmdEyeにCamera(Eye)を置き、charaHeightを1.9(モデルの目の位置)にしています。