2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Hololens2でアイトラッキングをしてみた

Last updated at Posted at 2021-02-04

MRTKで視線認識(アイトラッキング)を使用したいが実装方法が分からない方が対象になっています。
使用方法を理解するために、VRMモデルを配置し、視線認識(アイトラッキング)をトリガーとして使い、モデルを動作させる流れを実装します。

実装環境

Unityバージョン 2019.4.17f1
MRTK2.5

MRTK2.5の環境が整っていなければ、こちらの記事を参考にインポートしてみてください。

準備するもの

1.VRMモデル
・VRMモデルの作成
こちらはVroidStudioで簡単に作成することが出来ます。
サンプルモデルから好きなモデルを選択→撮影・エクスポート(上段タブ)→エクスポート(左ペイン)
設定は適当で構いません。
UniVRMをインポート
こちらはUnityでVRMモデルを出力させるために必須であるため、インポートする必要があります。

2.アニメーション
VRMモデルに対して、アニメーションを付与するために、既存のアニメーションを持ってきます。今回付与するアニメーションは「しゃがむ」です。
Standard Assets (for Unity 2018.4)をAsset Storeからインポートします。
インポート後...
・ThirdPersonAnimatorController.controller と下図のファイルが必要なので、他のファイルは削除します。
image.png

実装

まず初めに、公式リファレンスを参考に視線認識の設定をします。
VRMモデルをインポートしたら、VRMモデルにAnimatorをAdd Conponentします。
AnimatorのcontrollerはThirdPersonAnimatorController.controllerを選択します。
image.png
Rigidbody、Capsule ColliderもAdd Conponentして、下図のように設定します。
image.png
VrmAnimationという名前でスクリプトを作成します。このスクリプトはAnimatorで設定されている「しゃがむ」動作に対してTrueかFalseを渡してAnimatorをコントロールする役割を持っています。
今回のメインは視線認識がであるため、説明は割愛させていただきます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
[RequireComponent(typeof(CapsuleCollider))]
[RequireComponent(typeof(Animator))]
public class VrmAnimation : MonoBehaviour
{
    Rigidbody m_Rigidbody;
    Animator m_Animator;
    CapsuleCollider m_Capsule;
    bool m_Crouching;

    // Start is called before the first frame update
    void Start()
    {
        m_Animator = GetComponent<Animator>();
        m_Rigidbody = GetComponent<Rigidbody>();
        m_Capsule = GetComponent<CapsuleCollider>();
        m_Rigidbody.constraints = RigidbodyConstraints.FreezeRotationX | RigidbodyConstraints.FreezeRotationY | RigidbodyConstraints.FreezeRotationZ;
        m_Crouching = false;
        Invoke("SetCrouch", 3.5f);
    }

    // Update is called once per frame
    public void SetRun()
    {
        m_Animator.SetFloat("Forward",0.1f, 0.1f, Time.deltaTime);
        m_Animator.SetFloat("Turn", 0.1f, 0.1f, Time.deltaTime);
    }
    public void SetCrouch()
    {
        if (!m_Crouching)
        {
            m_Crouching = true;
            m_Animator.SetBool("Crouch", m_Crouching);
        }
        else
        {
            m_Crouching = false;
            m_Animator.SetBool("Crouch", m_Crouching);
        }
    }
}

MRTKで用意されているEyeTrackingTargetをAdd Conponentします。
EyeTrackingTargetのOn Look At Startで下図のような設定を行います。今回はOnLookAtStartのみを使用していて、先ほどのスクリプト(VrmAnimation)で作成したメソッドが呼び出されるよう設定します。
image.png
EyeTrackingTargetの機能の説明として、
OnLookAtStart:ユーザーがターゲットを見始めたときにトリガーされます。
OnLookAway:ユーザーがターゲットから目をそらしているときにトリガーされます。
OnDwell:ターゲットが指定された、事前定義された期間(dwellTimeInSec)にわたって調べられたときにトリガーされます。
OnSelected:見たターゲットが選択されると、イベントがトリガーされます。
OnTapDown:RaiseEventManually_TapDownが呼び出されると、イベントがトリガーされます。
OnTapUp:RaiseEventManually_TapUpが呼び出されると、イベントがトリガーされます。

検証

Hololensにデプロイします。
視線を合わせる前が左の画像の状態、視線を合わせた後が右の画像の状態になっていれば成功です。
image.png

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?