夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

HoloLensでオブジェクトをカメラに合わせて配置する

本日はMRTKの調査枠です。

〇UnityでのHoloLensデバイスの座標の扱い

HoloLens(1st),HoloLens 2ではUnityの原点=(0,0,0)がアプリケーションの起動時の座標になります。

これは位置だけではなく角度も同様で、アプリケーションを起動した方向を基準に軸が定まります。

この特性上アプリケーション起動時はユーザーができるだけ静止しているほうがより良い体験が行えます。(起動する場所や向きによってはSpatialMeshにオブジェクトが埋もれてしまう現象が発生します。)

しかし、ユーザーによっては起動時の待ち時間に動いてしまう場合も想定されます。

この問題を解消するためにカメラ(ユーザー)に沿ってオブジェクトを配置するようにします。

〇カメラに合わせてオブジェクトを配置する。

MRTKには[HeadPositionOffset]という名前のコンポーネントが提供されています。

[HeadPositionOffset]を使用することでオブジェクトをユーザーの位置に合わせて配置することができます。

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

using UnityEngine;

namespace Microsoft.MixedReality.Toolkit.Utilities
{
    /// <summary>
    /// Set the content around the camera height
    /// </summary>
    [AddComponentMenu("Scripts/MRTK/SDK/HeadPositionOffset")]
    public class HeadPositionOffset : MonoBehaviour
    {
        public Vector3 HeadOffset = new Vector3(0, 0, 1f);

        private bool started = false;

        private void Start()
        {
            transform.position = CameraCache.Main.transform.position + HeadOffset;
            started = true;
        }

        private void OnEnable()
        {
            if (started)
            {
                transform.position = CameraCache.Main.transform.position + HeadOffset;
            }
        }
    }
}

中身は非常に簡単で、主な処理は

                transform.position = CameraCache.Main.transform.position + HeadOffset;

になります。

これは自身の位置をカメラの座標+指定した任意のオフセットに変位させるという処理になります。

これによってオブジェクトを表示する際など確実にユーザーの目に入るような位置に配置することができます。