本日はMRTKExamples勉強枠です。
HoloLens 2ではEyeTrackingの機能が使用できるようになりました。
今回はEyeTrackingDemo-05-VisualizerシーンのEyeTrackingデータの録画に関して調査していきます。
〇EyeTrackingDemo-05-Visualizer
HoloLens 2ではユーザーの目線を取得するEyeTrackingが使用可能になりました。
これによって開発者はユーザーの目を使った操作を提供するだけではなくどこを見ていたかの情報を得ることができるようになりました。
EyeTrackingDemo-05-Visualizerシーンではユーザーがどこを見ていたかをヒートマップで見ることができる例が紹介されています。
本日はこのサンプルシーンを基にユーザーの目線を追跡し、ユーザーがどこを見ているか表示するオブジェクトを実装します。
〇EyeTrackingデータの録画
sampleシーンでは[LogStructureEyeGaze]というコンポーネントで保存するデータの構造体が作成されています。
[LogStructureEyeGaze]コンポーネントは[SceneContent]→[GazeVisualizer]→[ET_Recorder]オブジェクトにアタッチされています。
〇データの名称
保存されるデータは次のようになります。
return new string[] { // UserId "UserId", // SessionType "SessionType", // Timestamp "dt in ms", // Cam / Head tracking "HeadOrigin.x", "HeadOrigin.y", "HeadOrigin.z", "HeadDir.x", "HeadDir.y", "HeadDir.z", // Smoothed eye gaze tracking "EyeOrigin.x", "EyeOrigin.y", "EyeOrigin.z", "EyeDir.x", "EyeDir.y", "EyeDir.z", "EyeHitPos.x", "EyeHitPos.y", "EyeHitPos.z", };
文章で整理すると
・ユーザー情報(UserId)
・セッション情報(SessionType)
・時間情報(dt in ms)
・ユーザーの位置(HeadOrigin)
・ユーザーの向き(HeadDir)
・ユーザーの目の位置(EyeOrigin)
・ユーザーの目線の角度(EyeDir)
・目線の当たっている座標(EyeHitPos)
〇各データの取得
[LogStructureEyeGaze]コンポーネントの中でGetData関数によって各データの値の取得が行われます。
// Cam / Head tracking CameraCache.Main.transform.position.x, CameraCache.Main.transform.position.y, CameraCache.Main.transform.position.z, CameraCache.Main.transform.forward.x, CameraCache.Main.transform.forward.y, CameraCache.Main.transform.forward.z, // Smoothed eye gaze signal EyeTrackingProvider.IsEyeTrackingEnabledAndValid ? EyeTrackingProvider.GazeOrigin.x : 0, EyeTrackingProvider.IsEyeTrackingEnabledAndValid ? EyeTrackingProvider.GazeOrigin.y : 0, EyeTrackingProvider.IsEyeTrackingEnabledAndValid ? EyeTrackingProvider.GazeOrigin.z : 0, EyeTrackingProvider.IsEyeTrackingEnabledAndValid ? EyeTrackingProvider.GazeDirection.x : 0, EyeTrackingProvider.IsEyeTrackingEnabledAndValid ? EyeTrackingProvider.GazeDirection.y : 0, EyeTrackingProvider.IsEyeTrackingEnabledAndValid ? EyeTrackingProvider.GazeDirection.z : 0, (eyeHitPos != null) ? eyeHitPos.Value.x : float.NaN, (eyeHitPos != null) ? eyeHitPos.Value.y : float.NaN, (eyeHitPos != null) ? eyeHitPos.Value.z : float.NaN, }
デフォルトではユーザーの角度は0が与えられていたため筆者のほうで正しい値を入れています
各データをまとめると次のようになります。
・ユーザー情報(UserId)
・セッション情報(SessionType)
・時間情報(dt in ms)
・ユーザーの位置(HeadOrigin)
CameraCache.Main.transform.position
・ユーザーの向き(HeadDir)
CameraCache.Main.transform.forward.x
・ユーザーの目の位置(EyeOrigin)
EyeTrackingProvider.IsEyeTrackingEnabledAndValid ? EyeTrackingProvider.GazeOrigin.x : 0
[IsEyeTrackingEnabledAndValid]はユーザーのEyeTrackingのが使用されているかを判別するもので、使用されている場合(True)は
EyeTrackingProvider.GazeOriginで、使用されていない場合は0の値が記録されます。
・ユーザーの目線の角度(EyeDir)
EyeTrackingProvider.IsEyeTrackingEnabledAndValid ? EyeTrackingProvider.GazeDirection.x : 0,
こちらもEyeTrackingが有効な場合のみEyeTrackingProvider.GazeDirectionで記録されます。。
・目線の当たっている座標(EyeHitPos)
(eyeHitPos != null) ? eyeHitPos.Value.x : float.NaN,
[eyeHitPos]はEyeTrackingProviderのHitPositionになります。 これはEyeTrackingのデータがオブジェクト等に当たっているかを判定します。
if (EyeTrackingProvider?.GazeTarget != null && EyeTrackingProvider.IsEyeTrackingEnabledAndValid) eyeHitPos = EyeTrackingProvider.HitPosition;
EyeTrackingProviderのHitPositionのValueで座標を求めることができます。
以上がEyeTrackingDemo-05-Visualizer で提供されている目線の録画データの一覧です。
〇実際のデータ
UserId, SessionType, dt in ms, HeadOrigin.x, HeadOrigin.y, HeadOrigin.z, HeadDir.x, HeadDir.y, HeadDir.z, EyeOrigin.x, EyeOrigin.y, EyeOrigin.z, EyeDir.x, EyeDir.y, EyeDir.z, EyeHitPos.x, EyeHitPos.y, EyeHitPos.z tester, Session00, 94.8953, 0.02786334, 0.07586093, 0.05462131, 0.1341618, -0.08130625, 0.9876183, 0.02548688, 0.07396442, 0.06762824, 0.3078245, -0.2147296, 0.9268955, 0.127898, 0.002525352, 0.376
1フレーム目にはデータ項目が並び2フレーム目(2行目)から実際の録画が始まります。