はじめに
HoloLens 2で指の位置を取得し、空間上に表示する方法を調べてみました。
今回は指先の位置に立方体を追従させるということをやってみたいと思います。
環境
Unity 2020.3.11f1
MRTK 2.7.2
OpenXR Plugin 2.1.8
手順
プロジェクトの作成
Microsoft Learnの以下のモジュールを参考にプロジェクトを作成してください。
(「演習 - リソースをインポートして構成する」まででOKです)
Mixed Reality Toolkit の概要 - Mars キュリオシティ ローバーのホログラムを作成する - Learn | Microsoft Docs
スクリプトの作成
指の位置の取得についてはMRTKの機能を使います。具体的には以下の通りです。
if (HandJointUtils.TryGetJointPose(TrackedHandJoint.IndexTip, Handedness.Right, out MixedRealityPose pose))
{
// ...
}
HandJointUtilsクラスのTryGetJointPoseメソッドを利用すると手の様々な部分の位置情報を取得できます。
1番目の引数(TrackedHandJoint.IndexTip)では位置を取得する部分を指定します。
ここではIndexTip(人差し指の指先)を指定していますが、他の指や手のひらなど色々な位置を設定できます。
詳しくは以下のドキュメントを参照してください。
TrackedHandJoint Enum (Microsoft.MixedReality.Toolkit.Utilities) | Microsoft Docs
位置の名称については以下の図を見るのがわかりやすいです。
(「既定のハンド 関節表現」の下にある図です。右にスクロールできます。)
ハンド トラッキング - Mixed Reality Toolkit | Microsoft Docs
2番目の引数(Handedness.Right)では右手か左かを指定しています。
3番目の引数(pose)に取得した位置情報が入るのでこれを利用します。
今回は「右手の人差し指に立方体を表示する」ための実装を行います。そのためにはスクリプトは以下のようになります。
using Microsoft.MixedReality.Toolkit.Input; using Microsoft.MixedReality.Toolkit.Utilities; using UnityEngine; public class HandTrackingTest : MonoBehaviour { //表示するオブジェクトを定義 GameObject indexTip; void Start() { indexTip = GameObject.CreatePrimitive(PrimitiveType.Cube); //表示用の立方体を作成 indexTip.transform.localScale = new Vector3(0.03f, 0.03f, 0.03f); //大きさを指定 } void Update() { //右手の人差し指の指先の位置情報を取得 if (HandJointUtils.TryGetJointPose(TrackedHandJoint.IndexTip, Handedness.Right, out MixedRealityPose pose)) { indexTip.transform.position = pose.Position; //座標を設定 indexTip.transform.rotation = pose.Rotation; //回転を設定 } } }
Unityでの設定
作成したスクリプトが動作するよう、Unityエディタで設定を行います。
①Hierarchyで「右クリック」→「Create Empty」と押していき、空のオブジェクトを作成
②スクリプトをアタッチ
デモ
HoloLens 2にデプロイして実行すると以下のようになります。
参考
公式ドキュメント
https://docs.microsoft.com/ja-JP/windows/mixed-reality/mrtk-unity/features/input/hand-tracking
Youtube 動画
Custom Hand Tracking in Unity for HoloLens - YouTube