仮想と物理とエトセトラ

xRや物理とかごった煮の備忘録的技術ブログ

MRTK(2.7.2)のExampleを試す その3 (EyeTracking)

今回は前回の続きです。

xr-physics-work-etc.hatenablog.com

前提

今回の前提は以下です。
Unity 2019.4.17f1
MRTK 2.7.2

準備

前回と同じようにPackage Managerから対象のデモをImportします。
f:id:napo909:20211205135836p:plain

EyeTrackingDemo-00-RootScene

このSceneはEyeTrackingの各デモに遷移するためのSceneです。 f:id:napo909:20211205141810p:plain

EyeTrackingのデモでは、Gaze SettingsにEyeGazeCursorが設定されており、視線が何を指しているか確認できるようになっています。

f:id:napo909:20211205151114p:plain

EyeCalibrationChecker

デモ用のスクリプトですが、使いまわしがききそうなので、EyeCalibrationCheckerを取り扱います。
このスクリプトでは、HoloLensのEye Trackingのキャリブレーションが済んでいるかどうかで、アプリ起動時またはキャリブレーションを実施したタイミングで実行するUnityEventを切り替えることができます。
HoloLensでは、アプリ内からキャリブレーションを実施して戻ってくる、ということもあるので、Eye Trackingに関する設定を行う場合は、キャリブレーションが済んだタイミングで設定などを切り替える必要があります。

EyeCalibrationCheckerではInspector上から下記設定が行えます。

f:id:napo909:20211205142812p:plain

EyeTrackingDemo-01-BasicSetup

このデモでは、視線に追従する紫色のカーソルと、物体に視線を合わせ、タップすることで視線で物体を選択できることを試すことができます。

f:id:napo909:20211205150706p:plain

FollowEyeGazeGazeProvider

このスクリプトでは、アタッチしたオブジェクトの位置を視線でポイントしている場所に移動させることができます。
視線で何をポイントしているか、強調することができます。

Inspector上で設定できるパラメタは以下です。

  • defaultDistanceInMeters
    自分とFollowEyeGazeGazeProviderをアタッチしたオブジェクトとの距離。デフォルト値は2m

f:id:napo909:20211205155934p:plain

ColorTap

このスクリプトでは、アタッチしたオブジェクトのマテリアル色をHover, Selectしたときに変更することができます。
色を変えることで、選択できているか否か、明確にすることができます。

Inspector上で設定できるパラメタは以下です。

  • tapAction
    対象とするInputAction。選択であれば、Selectを設定する。デフォルト値はNone

  • color_IdleState
    通常時(未選択)の時に設定される色。デフォルト値はColor.cyan

  • color_OnHover
    Hover(Hand rayや視線などでポイントする)した際に変更する色。デフォルト値はColor.white

  • color_OnSelect
    tapActionに設定したものを物体に対して実行した場合に変更する色。(Selectの場合はタップ操作)デフォルト値はColor.blue

f:id:napo909:20211205160020p:plain

EyeTrackingDemo-02-TargetSelection

このデモでは、視線を合わせた際に物体に実行させることができる挙動を確認できます。
視線を合わせたり、視線を合わせた状態でタップ操作をすることで物体操作が遠距離で実施できます。

f:id:napo909:20211205153521p:plain

EyeTrackingTarget

このスクリプトでは、自オブジェクトに対して視線が当たっている際に行う動作を設定できます。
視線の操作だけでなく、ボイスコマンドにも紐づけることできます。
Inspector上で設定できるパラメタは以下です。

  • Select Action
    対象とするInputAction。選択であれば、Selectを設定する。デフォルト値はNone

  • Voice Select
    視線が合っているときに有効になるボイスコマンド。ボイスコマンドを実行することでOnSelectedが発火する。

  • Dwel Time In Sec
    OnEyeFocusDwellが発火するために視線を当て続ける必要のある時間。

  • On Look At Start
    視線を合わせ始めた際に実行されるイベント

  • While Lokking At Target
    視線を合わせ続けているときに毎フレーム実行されるイベント

  • On Look Away
    ターゲットから視線を外した際に実行されるイベント

  • On Dwell
    Dwel Time In Secで設定した時間の間視線を合わせ続けると発生するイベント。(1回のみ)

  • On Selected
    視線を合わせつつ、タップやボイスコマンドで発火させることができるイベント。

  • On Tap Down
    RaiseEventManually_TapDownが呼ばれた際に実行されるイベント

  • On Tap Up
    RaiseEventManually_TapUpが呼ばれた際に実行されるイベント

RaiseEventManually_TapUp, RaiseEventManually_TapDownについては情報があまり見つからず、実際にどのタイミングで発火するか不明瞭。

f:id:napo909:20211205154026p:plain

EyeTrackingDemo-03-Navigation

このデモでは、テクスチャの拡縮、移動を実施できるPanZoomTextureや、スクロールを実施できるScrollRectを視線を合わせることで発火させることができます。

f:id:napo909:20211205160119p:plain

OnLookAtRotateByEyeGaze

このスクリプトでは、アタッチしたオブジェクトに視線が当たっている間、物体を回転させることができます。
BaseEyeFocusHandlerを継承しており、OnEyeFocusStayをオーバライドすることで視線が当たった際の動作を設定しています。
Inspector上で設定できるパラメタは以下です。

  • Focus Enabled
    Focusが有効かどうか設定できる(BaseFocusHandlerからの継承)

  • Time To Trigger Dwell In Sec
    Dwellを発火させるために必要なFocus時間(BaseEyeFocusHandlerからの継承)

  • Speed X, Y
    それぞれの軸の回転速度。(0の場合は回転しない)

  • Inverse X, Y
    それぞれの軸の回転方向を反転させるか否か

  • Rotation Thresh In Degrees
    少しの回転を繰り返さないようにするための閾値

  • Min Rot X, Y
    最小回転角

  • Max Rot X, Y
    最大回転角

f:id:napo909:20211205162547p:plain

EyeTrackingDemo-04-TargetPositioning

このデモでは、視線を合わせることで物体を選択し、タップすることで移動させることができます。
キューブや、スライダを視線とタップ操作だけで操作することができます。

f:id:napo909:20211205164013p:plain

MoveObjByEyeGaze

このスクリプトでは、アタッチしたオブジェクトに視線が当たっている間、物体を移動させることができます。
移動させることのできる軸や、移動量を制限することができます。

  • Use Eye Supported Target Placement
    視線で物体配置を有効化するかどうかの設定

  • Min Look Away Dist To Enable Eye Warp
    ※確認中※

  • Hand Input Enabled
    移動を音声のみで行う場合は、falseにする

  • Handmapping
    手の移動量の何倍の動きを物体にさせるか

  • Delta Hand Movem Thresh
    手の動きを有効にする閾値

  • Transparency_in Transition
    ドラッグしている間のターゲットの透明度設定

  • Transparency_preview
    プレビューをドラッグしている間のターゲットの透明度設定

  • Preview Placem Dist Thresh
    ※確認中※

  • Freeze X, Y, Z
    動きを制約する軸方向

  • Local Min Max_X, Y, Z
    各軸の移動量の制約

  • Placement Surface
    配置する平面の方向(水平か、垂直か)

  • Audio_On Drag Start
    ドラッグ開始時の音

  • Audio_On Drag stop
    ドラッグ停止時の音

  • Voice Action_Put This
    ドラッグ開始に使用するInputAction(音声コマンド用)

  • Voice Action_Over Here
    ドラッグ終了時に使用するInputAction(音声コマンド用)

  • On Drag Start
    ドラッグ開始時に発生させるイベント

  • On Drop
    ドラッグ終了時に発生させるイベント

  • User as Slider
    スライダとして使用するか否か

  • Txt Output_slider Value
    スライダ位置を表示するためのTextMeshオブジェクト

  • Slider_snap To Neareset Decimal
    スライダの場合の刻み幅

f:id:napo909:20211205164415p:plain

EyeTrackingDemo-05-Visualizer

このデモでは視線の当たった箇所が熱源のように、ヒートマップを表示するデモです。
視線の軌跡を可視化することができます。

f:id:napo909:20211205170837p:plain

このデモでは、InteractableEyeTrackingTargetを組み合わせることで、Interactableのアタッチされたオブジェクトに視線を与えてタップ動作をするだけでOnClickを発火させることができます。

f:id:napo909:20211205171626p:plain

DrawOnTexture

このスクリプトでは、視線の当たった位置に、Tableとして設定したTextureから取得した色を設定できるものです。
EyeTrackingTarget::LookedAtPointを使用して視線の当たった位置の座標を取得することで、視線が当たった位置の色を変更しています。
Inspector上で設定できるパラメタは以下です。

  • Heatmap Look Up Table
    ヒートマップ(描画する色)をTextureとして設定する

  • Draw Brush Size
    ヒートマップで色を変更する範囲のサイズ

  • Draw Intensity
    ヒートマップの最大強度

  • Min Thresh Delta Heat Map
    ヒートマップ表示のための閾値

  • Use Live Input Stream
    ヒートマップの結果をすぐに表示するか否か

  • Heatmap Overlay Material Templete
    ヒートマップ描画前のベースのmaterial

f:id:napo909:20211205172738p:plain

今回はここまでです。
次回はGltfのデモを確認します。