🥽

Varjo XR-3 + MRTK Unity開発環境(URP)構築

2022/08/15に公開

概要

本記事では、ハンドトラッキングの利用を目的にVarjo XR-3の開発環境構築に関して紹介したいと思います。

本記事では、ハンドトラッキング機能の実現方法に関して、Hololens2開発などで利用されているMRTK(Mixed Reality Toolkit)を選択しています。
MRTKのShaderの関係でURPを選択していますが、HDRPで動作しないわけではないため、用途に応じて変更して頂ければと思います。

利用した環境一覧

名称 バージョン
Unity 2020.3.36f1
URP 10.9.0
Varjo developer 3.6.1
VarjoUnityXRPlugin 3.1.1
Ultraleap Tracking Plugin(Unity Plugin) 5.13.0
Mixed Reality Toolkit Foundation 2.8.2
Mixed Reality Toolkit Standard Assets 2.8.2
Mixed Reality Toolkit Tools 2.8.2

設定手順

1. VarjoUnityXRPluginのインポート

以下のUnity用Pluginを利用します。
https://github.com/varjocom/VarjoUnityXRPlugin

Unityのバージョンや、その他のSDKとの適合性に関しては以下のURLを参考下さい。
https://developer.varjo.com/docs/unity-xr-sdk/compatibility

(1) Pluginのインポート

UnityEditorのWindows → PackageManagerを選択する。Add Package from git URLを選択し、https://github.com/varjocom/VarjoUnityXRPlugin.git と入力する。

(2) Pluginの反映

importが完了したら、Project Settings → XR Plug-in Management でVarjoにチェックを入れます。

2. UltraleapTrackingPluginのインポート

XR-3ではUltraleap Trackingを利用してハンドトラッキングを行っています。MRTKには、本項で設定したLeap Motionの機能を統合する形で利用していきます。

(1) Pluginのインポート

以下のサイトにアクセスします。
https://github.com/ultraleap/UnityPlugin

画面右のReleaseを押下し、Unity Plugin 5.3.0を選択する。

ダウンロードした「Ultraleap.UnityPlugin-5.3.0.zip」を解凍し、Tracking.unitypackageをインポートする。

(2) MRTKを利用しない場合のカメラ設定

ここまででVarjo XR-3として必要なインポートは終わりました。
もしMRTKを必要としない場合は、Leap XR Service Providerコンポーネントの設定を行えば良いです。

次項に移る前に、MRTKを使用しない場合のカメラ設定方法を記載します。
Sceneに配置したCameraを開き、以下の設定を行います。
Rendering → Post Processing のチェックを外す。

Environment → Background Type でSolid Colorを選択する。
BackgroungでColorウィンドウを開き、(RGBA)=(0,0,0,0)を設定する。

Output → HDR をOFFに設定する。

3. MRTK(Mixed Reality Toolkit)のインポート

(1) MRTKのインポート

Mixed Reality Feature ToolでStartを押下し、プロジェクトの選択を行います。

自分のUnityプロジェクトを選択しDiscoverFeaturesを押下します。

Featuresに以下を選択する。

  • Mixed Reality Toolkit Foundation
  • Mixed Reality Toolkit Standard Assets
  • Mixed Reality Toolkit Tools

Approveを押下する。

再度、Unityプロジェクトを開く。

MRTK Project Configuratorが表示されるのでNextを押下する。

全ての項目に太陽マーク(?)が無い場合はApplyを押下する。
TextMeshProのインポートが済んでいない場合はimportの可否を確認されます。特に問題なければNextに進みTMPをインポートする。(この時点ではどっちでもOK)

(2) ハンドトラッキング機能の統合

Mixed Reality → Toolkit → Utilities → Leap Motion → Integrate Leap Motion Unity Modules を選択する。

成功すると以下の様なメッセージが表示される。

(3) SceneにMRTKを反映

お約束の手順
Mixed Reality → Toolkit → Add to Scene and Configure

Hierarchyに以下のオブジェクトが生成されることを確認する。

  • MixedRealityToolkit
  • MixedRealityPlayspace
  • MixedRealitySceneContent

(4) MRTKのShaderをURPに変更

Mixed Reality → Toolkit → Utilities → Upgrade MRTK Standard Shader for Universal Render Pipline を選択する。

成功した場合、以下のようなメッセージが表示される。

(5) ProfileのInputにLeapMotionを追加

MixedRealityToolkitオブジェクトに設定されているMixedRealityToolkitコンポーネントから、
DefaultMixedRealityToolkitConfigurationProfileの右横にあるCloneを押下する。

任意の新プロファイル名を入力し、Cloneを押下する。(画像ではCustomMixedRealityToolkitConfigurationProfileと入力した。)

各項が選択出来るようになったので「Input」を選択する。
DefaultMixedRealityInputSystemProfileの右横にあるCloneを押下する。

任意の新プロファイル名を入力し、Cloneを押下する。(画像ではCustomMixedRealityInputSystemProfileと入力した。)

詳細項目が選択出来るようになったので「InputDataProviders」を開き、「+Add Data Provider」を押下する。

新しくProviderが追加されたので、これをLeapMotionに対応させる。(画像ではNew data provider 13が追加された)

Typeを選択し、Microsoft.MixedReality.Toolkit.LeapMotion.Input → LeapMotionDeviceManagerを選択する。

LeapMotionDeviceManagerProfileの右横にあるCloneを押下する。

任意の新プロファイル名を入力し、Cloneを押下する。(画像ではCustomLeapMotionDeviceManagerProfileと入力した。)

varjo公式を参考に、HandTrakingのoffset値を設定する。

項目 設定値
Y -0.0112
Z 0.0999
X tilt 0

「Leap VR Device Offset Mode」を「Manual Head Offset」に変更する。

以下の2項目に上述したoffset値を設定する。

  • Leap VR Device Offset Y
  • Leap VR Device Offset Z

4. MR(MixedReality)として利用する場合

単純なVRデバイスとして利用したい場合は3項までの設定で完了です。

本項では、MRデバイスとして利用する場合の設定に関して記述します。
XR-1の設定方法の記事でも解説しましたが、XR-3はHololens2のように肉眼で現実空間が見えているわけではなく、XR-3の前面に内蔵されたカメラ映像を描画することでMRを実現しています。従って、Unity空間中で現実空間を描画したい箇所を指示し、Varjo compositor側に送る必要があります。

(1) Rendering設定

Project Settings → XR Plug-in Management → Varjoから、Opaque のチェックを外す。

(2) MRTK Camera設定

2項でMRTKを使用しない場合のカメラ設定に関して記述しました。
しかし、MRTKではProfileのCameraに設定したDisplay Settings情報が最終的にカメラに反映されるため、以下の通りProfileを設定する必要があります。

Profile → Camera を選択する。任意の新プロファイル名を入力し、Cloneを押下する。(画像ではCustomMixedRealityCameraProfileと入力した。)


詳細項目が選択出来るようになったので DisplaySettings → Clear Flags を押下する。
Solid Colorを選択する。(多分、Colorになる。)

Background ColorでColorウィンドウを開き、(RGBA)=(0,0,0,0)を設定する。

(3) Renderingの実行

VarjoMixedRealityController.csの通り、VarjoMixedReality.StartRender()を呼び出すことで、レンダリングが開始されます。Create Emptyで適当に空のGameObjectを作成して、Addすれば良いです。

VarjoMixedRealityController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Varjo.XR;

public class VarjoMixedRealityController : MonoBehaviour
{
    void Start()
    {
        VarjoRendering.SetOpaque(false);
        VarjoMixedReality.StartRender();
    }
    
    void Update()
    {        
    
    }
}

(4) 深度推定の有効化

上述した設定を反映したことで、現実空間中に3Dコンテンツが表示されていると思います。
しかし、自身の腕で3Dコンテンツを遮るようにしても、3Dコンテンツが常に前面に表示されていないでしょうか?

XR-3にはLiDARセンサが搭載されており距離を計測しています。本項では、深度推定を有効化する方法に関して記述します。
(3)で解説したコードを以下の通り変更して下さい。

VarjoMixedRealityController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Varjo.XR;

public class VarjoMixedRealityController : MonoBehaviour
{
    void Start()
    {
        VarjoRendering.SetOpaque(false);
	VarjoRendering.SetOcclusionMeshEnabled(true);
	VarjoRendering.SetSubmitDepth(true);
	// 例として極端に0~50mとしています。
	VarjoRendering.SetDepthTestRangeEnabled(true);
	VarjoRendering.SetDepthTestNearZ(0.0f);
	VarjoRendering.SetDepthTestFarZ(50.0f);
	VarjoMixedReality.EnableDepthEstimation();
        VarjoMixedReality.StartRender();
    }
    
    void Update()
    {        
    
    }
}

上記のコードでは、0~50 [m]を深度推定の有効範囲としました。
例えば、自身の周囲全体が3Dコンテンツで覆われたVRを想定した場合、仮に0~0.8 [m]と設定したとします。この場合、XR-3から0.8 [m]以内の深度推定を有効化しており、0.8 [m]以内に存在する自身の腕などで、それよりも遠方にある3Dコンテンツを遮蔽することが可能です。

おしまい

読んで頂き、ありがとうございました。
MRTKを利用すると1つのコンテンツ内で物理コントローラーやハンドトラッキング、その他の入力デバイスを柔軟に切り替えられるので便利ですよね。

この記事の環境構築を改めて行ったのは2022年8月ですので、また環境構築する際には都度、Varjo公式ドキュメントを参考することをオススメします。特に今回の記事で紹介しましたが、購入時に環境構築した時と比べてハンドトラッキングのプラグイン提供方法が変わっていました。将来的には、他にも何か変わっていることがあるかもしれませんので注意下さい。

では、今回はこの程度で。ありがとうございました。

Discussion