LoginSignup
3
5

More than 3 years have passed since last update.

【Unity】モデルとHMDの位置をキャリブレーションする方法

Posted at

概要

モデルの頭部とHMDの位置を同じ座標に合わせます。
FinalIKなどを使わない時に,モデルの視点とHMDの視点を合わせたい時に使いました。

※注意 CameraRigの位置を動かします。

環境

  • Unity 2018.3.14
  • SteamVR 2.2
  • Unity-Chan
  • HTC Vive

大まかな流れ

  1. Calibrator用のGameObjectの作成
  2. Caribrator.csの作成
  3. 1.のGameObjectに,2.のスクリプトをアタッチ
  4. Caribrator.csにCameraRig, Camera, モデルの頭部を設定
  5. オフセット値を設定(任意)
  6. SteamVR_Play_AreaのBorder Thicknessを設定(任意)

Caribratorの作成(1-2)

Hierarchyで右クリックして,CreateEmptyを選択。Calibrator用のGameObjectの作成する。
Projectで右クリックして,C# Scriptの作成。スクリプトは下記にあります。

Caribratorの作成(3-4)

Caribrator.csにCameraRig, Camera, モデルの頭部を設定。
CameraRigは,SteamVRの[CameraRig]を設定
HMDEyePosは,[CameraRig]ないのCameraを設定
ModelHeadPosは,モデルの頭部のオブジェクトを設定

スクリーンショット 2019-05-22 12.11.53.png

スクリプトの流れ・仕組み

  1. CameraRig, Camera, モデルの頭部の座標を取得。
  2. cキーの入力を待機。
  3. モデルの頭部の座標からCameraの座標を引いてズレを計算。
  4. CameraRigの座標に3で計算したズレを加算し,モデル頭部とCameraの座標を一致させる。

コード

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

public class Caribrator : MonoBehaviour
{
    /**
    * CameraRigの位置
    */
    [SerializeField]
    Transform cameraRig;

    /**
    * HMDの目の位置
    */
    [SerializeField]
    Transform hmdEyePos;

    /**
    * モデルの頭の位置 
    */
    [SerializeField]
    Transform modelHeadPos;

    /**
    * 微調整パラメータ
    */
    [SerializeField, Range(-0.5f, 0.5f)]
    float x_offset; //0.01 Unity-ChanのCharacter1_Headを選択したとき

    [SerializeField, Range(-0.5f, 0.5f)]
    float y_offset; //0.03

    [SerializeField, Range(-0.5f, 0.5f)]
    float z_offset; //0.11

    void Update(){
        if(Input.GetKey("c")){
            Calibrate();
        }
    }

    /**
    * キャリブレーション 
    */
    public void Calibrate () {
        float x = modelHeadPos.transform.position.x - hmdEyePos.transform.position.x + x_offset;
        float y = modelHeadPos.transform.position.y - hmdEyePos.transform.position.y + y_offset;
        float z = modelHeadPos.transform.position.z - hmdEyePos.transform.position.z + z_offset;
        cameraRig.position = new Vector3(cameraRig.position.x + x, cameraRig.position.y + y, cameraRig.position.z + z);
        // Debug.Log("y: " + y); 
    }
}

実行結果

カメラの位置

ブログ図.001.jpeg

視点

ブログ図.002.jpeg

3
5
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
3
5