Tobii Eye Trackerで視線検出
Tobii Eye Tracker
トビー・テクノロジーが開発する Tobii Pro X2や Tbii Eye Tracker 4Cなどの視線入力装置を ゲームエンジンのUnityで利用するための実装方法を解説します. これらの視線入力装置は,既に,FFXV など143のPCゲームで利用可能であり(2019年7月現在), ゲームをより楽しむためのサポート手段として用いられています. 視線入力装置を利用したゲーム映像はTobii Gamesで公開されているので視聴してみると良いでしょう.
Unityでの開発にはTobii Unity SDK for Desktopを利用します. この開発キットは,あくまで個人利用向けであり,分析を目的として利用する場合は,別途ライセンスの購入が必要なことに注意してください(向は分析用のライセンスも所持しています). また,システム要件として下記が挙げられています.
- バージョン 5 または 4.5 以上のUnity
- ウィンドウズ10,8.1,7
- Core Softwareのインストール
それでは,Tobii Unity SDK for Desktopをダウンロードしてください. 2019年7月現在のバージョンは 4.04 です.
プロジェクトの作成
まずは,Unityでプロジェクトを新規作成します. テンプレートは 2D ,プロジェクト名は TobiiSample に設定します(もちろん 3D でも利用可能です).
次に,ダウンロードした,Tobii Unity SDK for Desktopをプロジェクトに導入しましょう. [Assets] → [Import Package] → [Custom Package] をクリックし,ダウンロードしたファイルを選択します.
背景とオブジェクトの設定
背景を設定しましょう. ここでは,Main Camera の Background を白(#FFFFFF)にします(別にどんな色でも構いませんが).
また,注視対象となるオブジェクトを配置します. ここでは,Cube と Sphere を用います. Cube の位置は (-5, 0, 0) ,スケールは (2, 2, 2) に設定します. 同様に Sphere の位置は (5, 0, 0),スケールは (2, 2, 2) に設定します.
これで,ゲーム画面には,白い背景に,黒い正方形(Cube)と円(Sphere)が描画されるはずです. この正方形と円に対する注視を検出することにします.
注視の検出
それでは,作成した Cube と Sphere に対する注視を検出してみましょう. まずは,オブジェクトを選択し, Add Component をクリックします. ここで, Gaze Aware となっているコンポーネントを選択します. これで,Cube と Sphere は注視を検出する対象となります.
また,先程と同様に,オブジェクトを選択し, Add Component をクリックします. 今度は,New Script をクリックします. 作成するスクリプト名は GazeTarget とします.
それでは,スクリプトを編集しましょう. まずは, Tobii.Gaming ライブラリを先頭に追加します. ここでは,Cube と Sphere に対する注視状態(注視している or 注視してない)を取得することにします. この注視状態は GazeAware クラスの, HasGzeFocus フィールドに保持されます. 注視しているときは True ,注視していないときは False となります.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Tobii.Gaming; //ライブラリの追加
public class GazeTarget : MonoBehaviour
{
//注視情報
private GazeAware gazeAware;
void Start()
{
//注視情報の取得
gazeAware = GetComponent<GazeAware>();
}
void Update()
{
//オブジェクトを注視していたらTrue
bool flg = gazeAware.HasGazeFocus;
Debug.Log(flg);
}
}
実行すると,コンソールに注視状態のログが表示されます. Cube と Sphere を注視していない状態では,Falseのカウント(図中は3936)が増加し, 注視すると,Trueのカウント(図中は732)が増加することが確認できます.
注視対象の可視化
最後に,Cube と Sphere の注視状態を,色で可視化してみましょう. ここでは,注視していたら 赤 ,注視していなければ 青 にマテリアル・カラーを変更することにします. まずは, 指向性ライト(DirectionalLight) を追加します.
これは,遠くの光源からの方向性のある光を表現しており,光が当たることでオブジェクトは発色します. 次に,条件文を利用して,フラグはTrueのときに赤,フラグがFalseのときに青を設定します.
void Update()
{
//オブジェクトを注視していたらTrue
bool flg = gazeAware.HasGazeFocus;
if(flg)
{
//注視していたら赤色に
gameObject.GetComponent<Renderer>().material.color = Color.red;
}
else{
//注視していなければ青色に
gameObject.GetComponent<Renderer>().material.color = Color.blue;
}
}
実行すると,下記のように注視したオブジェクトが赤く発色するようになります. このように,注視しているオブジェクトの取得はとても簡単に実装できます.