MRが楽しい

MRやVRについて学習したことを書き残す

MRTK v2のドキュメントを少しずつ読み解く Unityスクリプトで視線追跡データにアクセスする

本日は MRTKv2 の調査枠です。
MRTKv2 の Guides ドキュメントを少しずつ読み進めていきます。

MRTKv2のGuidesドキュメント

以下のドキュメントを読み進めていきます。
microsoft.github.io

以下のページでは有志による本ドキュメントの日本語翻訳が行われています。
投稿時点でこちらで未翻訳、または著者が興味のある部分について記事にしていきます。
hololabinc.github.io

本記事では以下のページを読み進めます。
microsoft.github.io
f:id:bluebirdofoz:20200229215821j:plain

Unityスクリプトで視線追跡データにアクセスする

本セクションはMRTKシーンでアイトラッキングを設定する手順を実行したことを前提としています
microsoft.github.io

MonoBehaviour スクリプトから視線追跡データへ簡単にアクセスできます。
MixedRealityToolkit.InputSystem.EyeGazeProvider を使用するだけです。

MixedRealityToolkit.InputSystem.EyeGazeProvider

MixedRealityToolkit.InputSystem.EyeGazeProviderはいくつかの有用な変数を提供します。
アイトラッキング入力用のキーなものは次のとおりです。

UseEyeTracking

アイトラッキングハードウェアが利用可能で、ユーザーがアプリでアイトラッキングを許可している場合は True になります。

IsEyeCalibrationValid

ユーザーのアイトラッキングキャリブレーションが有効かどうかを示します。
値がアイトラッキングシステムからデータをまだ受信していない場合、「null」を返します。
ユーザーがアイトラッキングキャリブレーションをスキップすると、無効になります。

IsEyeGazeValid

現在の視線追跡データが有効かどうかを示します。
タイムアウトを超えたために無効になる場合があります。
(ただし、瞬きするユーザーに対して安定する必要があります)
ユーザーの目がキャリブレーションされているかどうかを検出し、適切な通知を表示する方法を説明するには、ミッシングアイキャリブレーション通知サンプルをご覧ください。
microsoft.github.io

GazeOrigin

視線の原点を示します。
IsEyeGazeValid が false の場合、これは頭部を基準にした視線の原点を返すことに注意してください。

GazeDirection

視線の方向を示します。
IsEyeGazeValid が false の場合、これは頭部を基準にした視線方向を返します。

HitInfo、HitPosition、HitNormalなど

現在ターゲットを注視していることに関する情報を示します。
IsEyeGazeValidが false である場合、これはユーザーの頭部を基準にした視線に基づいて行われます。

MixedRealityToolkit.InputSystem.EyeGazeProviderの使用例

FollowEyeGaze.csの例を以下に示します。

・ユーザーが見ているホログラムのポイントを取得します。

// Show the object at the hit position of the user's eye gaze ray with the target.
// ユーザーの視線のヒット位置にあるオブジェクトを表示します。
gameObject.transform.position = CoreServices.InputSystem.EyeGazeProvider.HitPosition;

・ユーザーが現在見ている場所から一定距離の位置にオブジェクトを設定します。

// If no target is hit, show the object at a default distance along the gaze ray.
// ターゲットがヒットしない場合、視線に沿ってデフォルトの距離でオブジェクトを表示します。
gameObject.transform.position =
CoreServices.InputSystem.EyeGazeProvider.GazeOrigin +
CoreServices.InputSystem.EyeGazeProvider.GazeDirection.normalized * defaultDistanceInMeters;