本日はHoloLensアプリの表現調査枠です。
先日のHoloLens Meetup Vol.21でLT登壇で登壇した内容に当たります。
〇HoloLens 2のアイトラッキング
HoloLens 2ではユーザーの目線を取得し、アプリないで情報を使用できるEyeTrackingの仕組みがあります。
MRTKでは[EyeTrackingTarget]のコンポーネントが提供されており、ユーザーが[EyeTrackingTarget]がアタッチされたオブジェクトを見た場合のリアクションが簡単に実装できます。
〇VRMのキャラクター
2018年からVrmと呼ばれる新しい規格が生まれました。
これはUnity Humanoidを持つGltf2.0がベースの人型3Dアバターの企画で、今までクリエイターによってボーンの数など統一性がなく、一つのアバターを複数の別々な開発者が開発したアプリケーション環境で実行する際に不具合が生まれることがありました。
こういった問題を解消しマルチな環境で使用できるアバターとしてvrmが生まれました。
VRoidStudio等のソフトウェアを用いて誰でも簡単にVRMのキャラクターを作成でき、BlenderやUnityでプラグインを使用することで開発者側の機能も整えられています。
〇VRMをUnityで使用する。
VRMのモデルをUnityで使用するためにはプラグインが必要です。[UniVRM]と呼ばれるアセットが公開されています。
上記リンクのGitHubからアセットをダウンロードしてUnityのプロジェクトにインポートするだけで使用することができます。
UniVRMがうまくインポートされると上部のタグに[VRM]が追加されます。
この状態で.vrmファイルをインポートするとプレファブに変換され使用可能になります。
〇VRMキャラクターとEyeTrackingTarget
作成されたプレファブをシーンに配置して頭の位置にコライダーを付けます。
このコライダーのオブジェクトに[EyeTrackingTarget]コンポーネントをアタッチして[On Dwel()]のイベントにキャラクターのプレファブを設定します。
キャラクターのプレファブオブジェクトに次のスクリプトをアタッチします。
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で削除しています。
実機で動かすと次のようになります。(動画だと視線がわかりにくいのでぜひ実機で試してみてください。)