これは、2020/02/08(土)から2020/02/09(日)に開催されたOsaka HoloLens "2" ハッカソン2020の準備のため
EyeTrackingネタをやろうと決めたときに調べた調査メモのようなものです。
EyeTrackingはずっと実機じゃないと使えないと思っていたのですが、
Unity上でもシミレーションできると知って試してみました。
今回の環境はUnity2019.
Microsoft Mixed Reality Toolkit v2.2.0 です。
Microsoft.MixedReality.Toolkit.Unity.Foundation.2.2.0.unitypackageのインポート
UnityのMixed Relaity ToolkitメニューからAdd to Scene and Configureを選択する等はいつも通り
わからない方は、以前の記事を参考にしてください。
EyeTrackingを利用するにはProfileの設定が必要です。
Hierarchyから、MixedRealityToolkitを選択し、Inpsectorを表示
InpsectorからCopy & Cutomizeをクリック
Cloning Profileのダイアログが出ますので、Profile Nameを決定してCloneボタンをクリック
Profile Nameは何でも良いのですが、今回はTextMixedRealityToolkitConfigurationProfileとしました。
InpsectorのProfileがTextMixedRealityToolkitConfigurationProfileに切り替わっていることを確認し
Profileの中からInputを選択 DefaultMixedRealityInputSystemProfileの横のCloneボタンをクリック
Cloning Profileのダイアログが出ますので、Profile Nameを決定してCloneボタンをクリック
Profile Nameは何でも良いのですが、今回はTestMixedRealityToolkitInputSystemProfileとしました。
InpsectorのProfileがTestMixedRealityToolkitInputSystemProfileに切り替わっていることを確認し
Input Data Providersの + Add Data Providerをクリック、New Data providerが追加されますので
▼マークをクリックして展開します。
New Data providerのTypeのドロップダウンから
Microsoft.MixedReality.Toolkit.WindowsMixedReality.Input > WindowsMixedRealityEyeGazeDataProviderを選択
Input Data Providersから Input Simulation Serveiceの▼マークをクリックして展開 DefultMixeRealityInputSimulationProfileのCloneボタンをクリック
Cloning profileのダイアログが出ますので、Profile Nameを決定してCloneボタンをクリック
Profile Nameは何でも良いのですが、今回はTestMixedRealityToolkitInputSimulationProfileとしました。
InpsectorのProfileがTextMixedRealityToolkitInputSystemProfileに切り替わっていることを確認し
Simulate Eye PositionのチェックをOnにします。
最後に、Hierarchyから、MixedRealityPlayspaceの下のMain Cameraを選択
InpsectorからUse Eye TrackingのチェックをOnにします。
これで、EyeTrackingのためのProfileの設定は完了です。
今回はEyeTrackingを利用して、視界に入ったらCubeの色を変えるようなサンプルを作成します。
HierarchyからCreate > 3D Object > CubeでCubeを作成
Cubeの座標を適当にCameraに写る位置に移動させます。(このサンプルでは x:0 y:0 z:2)
Hierarchyから、Cubeを選択、InpsectorからAdd Component > New Scriptを選択して新しいScriptを追加します。
Script名は特に何でも良いのですが、今回はEyeTrackingTestとしました。
EyeTrackingTestの中身はこんな感じです。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using UnityEngine; | |
public class EyeTrackingTest : MonoBehaviour | |
{ | |
// Start is called before the first frame update | |
public void AfterOnLookAtStart() | |
{ | |
this.GetComponent<Renderer>().material.color = Color.red; | |
} | |
public void AfterOnLookAway() | |
{ | |
this.GetComponent<Renderer>().material.color = Color.green; | |
} | |
} |
InpsectorからEyeTrackingTargetのイベントを設定します。
EyeTrackingTargetのイベントと、そのイベントの後、どのような動きになるかを関連づけます。
Hierarchyから、Cubeを選択、InpsectorのEyeTrackingTarget、On Look At Startに Runtime OnlyにはCube、Functionには、EyeTrackingTestのAfterOnLookStartを設定
InpsectorのEyeTrackingTarget、On Look Awayに Runtime OnlyにはCube、Functionには、EyeTrackingTestのAfterOnLookAwayを設定
これでアプリは完成です。Unityで実行するとこんな感じです。
なので、実機に入れないと実際の動きは確認しきれません
EyeTrackingTarget.csについて
こちらは、MixedRealityToolkit-Unityで提供されているScriptです。
文字どうり、EyeTrackingの対象となるオブジェクトにアタッチして利用します。
定義されているイベントに、そのイベントの後の処理を関連づけることで、制御を行っていきます。
イベントは下記
* OnDwell
Event is triggered when the target has been looked at for a given predefined duration (dwellTimeInSec).
ユーザーがdwellTimeInSecで指定された一定時間ターゲットを見ていた場合。
InpsectorからdwellTimeInSecが指定できるので、その秒数で指定された時間内でターゲットを見ていた時のようですが、 ちょっとよくわかりませんでした。
* OnLookAtStart
Event is triggered when the user starts to look at the target.
ユーザーがターゲットに視線が入った時
* WhileLookingAtTarget
Event is triggered when the user continues to look at the target.
ユーザーがターゲットを見続けたとき
*OnLookAway Event to be triggered when the user is looking away from the target.
ユーザーがターゲットから目をそらしたとき
* OnSelected
Event is triggered when the looked at target is selected
ターゲットが選択されたとき
これは、EyeTrackingで見つめて、かつ ハンドトラッキングのタップ、またはVoice Commandで対象のオブジェクトが選択された場合です。
目からビームでは、OnLookAtStartのタイミングで当たり判定を行いました。
そのため、必ずしもビームが当たらなくても視界に敵のターゲットが入った時点で
敵がダメージをくらい、うまい人だと、かなり長く遊べてしまいます。
WhileLookingAtTargetで3秒以上見つめたら、みたいな制御は必要だったかもしれません。
このようにEyeTrackingTarget.csを利用することで、
対象のオブジェクトに対する処理を書くだけでいいのは楽ですね。
しかし、きっちりとした制御を行うのは、
なにかしらもっと複雑な処理が必要になるかと思いますが
今のところ、僕の知識ではわかっていません。
EyeTrackingにつては他のデバイス含めて、
機会あるごとに積極的に使っていこうかと思っています。
何故かはわかりませんが、ハンドトラッキングよりも可能性が広がる気がしています