Tobii Eye Trackerで視線検出

Image from Gyazo

Tobii Eye Tracker

トビー・テクノロジーが開発する Tobii Pro X2Tbii Eye Tracker 4Cなどの視線入力装置を ゲームエンジンのUnityで利用するための実装方法を解説します. これらの視線入力装置は,既に,FFXV など143のPCゲームで利用可能であり(2019年7月現在), ゲームをより楽しむためのサポート手段として用いられています. 視線入力装置を利用したゲーム映像はTobii Gamesで公開されているので視聴してみると良いでしょう.

Unityでの開発にはTobii Unity SDK for Desktopを利用します. この開発キットは,あくまで個人利用向けであり,分析を目的として利用する場合は,別途ライセンスの購入が必要なことに注意してください(向は分析用のライセンスも所持しています). また,システム要件として下記が挙げられています.

それでは,Tobii Unity SDK for Desktopをダウンロードしてください. 2019年7月現在のバージョンは 4.04 です.

プロジェクトの作成

まずは,Unityでプロジェクトを新規作成します. テンプレートは 2D ,プロジェクト名は TobiiSample に設定します(もちろん 3D でも利用可能です).

Image from Gyazo

次に,ダウンロードした,Tobii Unity SDK for Desktopをプロジェクトに導入しましょう. [Assets] → [Import Package] → [Custom Package] をクリックし,ダウンロードしたファイルを選択します.

背景とオブジェクトの設定

背景を設定しましょう. ここでは,Main CameraBackground を白(#FFFFFF)にします(別にどんな色でも構いませんが).

Image from Gyazo

また,注視対象となるオブジェクトを配置します. ここでは,CubeSphere を用います. Cube の位置は (-5, 0, 0) ,スケールは (2, 2, 2) に設定します. 同様に Sphere の位置は (5, 0, 0),スケールは (2, 2, 2) に設定します.

Image from Gyazo

Image from Gyazo

これで,ゲーム画面には,白い背景に,黒い正方形(Cube)と円(Sphere)が描画されるはずです. この正方形と円に対する注視を検出することにします.

Image from Gyazo

注視の検出

それでは,作成した CubeSphere に対する注視を検出してみましょう. まずは,オブジェクトを選択し, Add Component をクリックします. ここで, Gaze Aware となっているコンポーネントを選択します. これで,CubeSphere は注視を検出する対象となります.

Image from Gyazo

また,先程と同様に,オブジェクトを選択し, Add Component をクリックします. 今度は,New Script をクリックします. 作成するスクリプト名は GazeTarget とします.

Image from Gyazo

それでは,スクリプトを編集しましょう. まずは, Tobii.Gaming ライブラリを先頭に追加します. ここでは,CubeSphere に対する注視状態(注視している 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);
    }
}

実行すると,コンソールに注視状態のログが表示されます. CubeSphere を注視していない状態では,Falseのカウント(図中は3936)が増加し, 注視すると,Trueのカウント(図中は732)が増加することが確認できます.

Image from Gyazo

注視対象の可視化

最後に,CubeSphere の注視状態を,色で可視化してみましょう. ここでは,注視していたら ,注視していなければ にマテリアル・カラーを変更することにします. まずは, 方向性ライト(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;
  }

}

実行すると,下記のように注視したオブジェクトが赤く発色するようになります. このように,注視しているオブジェクトの取得はとても簡単に実装できます.

Image from Gyazo

参考書籍

スポンサーリンク