夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

HoloLens 2のアイトラッキングを使用してVRMのキャラクターと対話する。

本日はHoloLensアプリの表現調査枠です。

先日のHoloLens Meetup Vol.21でLT登壇で登壇した内容に当たります。

〇HoloLens 2のアイトラッキング

 HoloLens 2ではユーザーの目線を取得し、アプリないで情報を使用できるEyeTrackingの仕組みがあります。

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

 MRTKでは[EyeTrackingTarget]のコンポーネントが提供されており、ユーザーが[EyeTrackingTarget]がアタッチされたオブジェクトを見た場合のリアクションが簡単に実装できます。

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

VRMのキャラクター

 2018年からVrmと呼ばれる新しい規格が生まれました。

 これはUnity Humanoidを持つGltf2.0がベースの人型3Dアバターの企画で、今までクリエイターによってボーンの数など統一性がなく、一つのアバターを複数の別々な開発者が開発したアプリケーション環境で実行する際に不具合が生まれることがありました。

 こういった問題を解消しマルチな環境で使用できるアバターとしてvrmが生まれました。

vrm.dev

 VRoidStudio等のソフトウェアを用いて誰でも簡単にVRMのキャラクターを作成でき、BlenderやUnityでプラグインを使用することで開発者側の機能も整えられています。

VRMをUnityで使用する。

VRMのモデルをUnityで使用するためにはプラグインが必要です。[UniVRM]と呼ばれるアセットが公開されています。

github.com

上記リンクのGitHubからアセットをダウンロードしてUnityのプロジェクトにインポートするだけで使用することができます。

f:id:Holomoto-Sumire:20200731095332j:plain

UniVRMがうまくインポートされると上部のタグに[VRM]が追加されます。

この状態で.vrmファイルをインポートするとプレファブに変換され使用可能になります。

f:id:Holomoto-Sumire:20200731095714j:plain

VRMキャラクターとEyeTrackingTarget

 作成されたプレファブをシーンに配置して頭の位置にコライダーを付けます。

f:id:Holomoto-Sumire:20200731095837j:plain

このコライダーのオブジェクトに[EyeTrackingTarget]コンポーネントをアタッチして[On Dwel()]のイベントにキャラクターのプレファブを設定します。

f:id:Holomoto-Sumire:20200731100038j:plain

キャラクターのプレファブオブジェクトに次のスクリプトをアタッチします。

using System.Collections;
using UnityEngine;
using VRM;

public class VRMReactor : MonoBehaviour
{
    //VRMData
    [SerializeField] GameObject _vrm;
    VRMLookAtHead _vRMLookAtHead;



    //UserData
    Transform _usersTransform;


    // Start is called before the first frame update
 void Start()
    {
        if (_vrm == null) 
        {
            _vrm = this.gameObject;
        }
        _vRMLookAtHead = this.gameObject.GetComponent<VRMLookAtHead>();
        _usersTransform = GameObject.Find("UIRaycastCamera").transform;
    }
    public void VRMLookAtUser()
    {
        Debug.Log("Hoge");
        _vRMLookAtHead.Target = _usersTransform; 
    }

    public void VRMUnLookAtUser()
    {
        _vRMLookAtHead.Target = null;
    }
}

EyeTrackingTargetコンポーネントのOn Dwell()イベントで[VRMLookAtUser()]、On Look Away()イベントで[VRMUnLookAtUser()]を指定してそれぞれ視線が当たってEyeTrackingTargetのDwell time In Secで指定した秒数後に[VRMLookAtUser()]が呼ばれ、視線が外れると[VRMUnLookAtUser()]が呼ばれます。

VRMのモデルのプレファブには視線変更のための[VRMLookAt]というコンポーネントが用意されています。

VRMReactorではStart関数でユーザーの位置(UIRaycastCamera)とキャラクターのVRMLookAtコンポーネントを取得してVRMLookAtUser()でVRMLookAtのターゲット=キャラクターの視線のターゲットをユーザーの位置に変え、VRMUnLookAtUser()で()このターゲットをnullで削除しています。

実機で動かすと次のようになります。(動画だと視線がわかりにくいのでぜひ実機で試してみてください。)

www.youtube.com