MRが楽しい

MRやVRについて学習したことを書き残す

HoloLens2でホロモンアプリを作る その44(ホロモンが一緒に頷いたり首を振る)

本日はアプリ作成枠です。
HoloLens2でホロモンアプリを作る進捗を書き留めていきます。
f:id:bluebirdofoz:20210703235245j:plain

今回はホロモンが一緒に頷いたり首を振るメモです。

ホロモンが一緒に頷いたり首を振る

以下の記事で作成した頭部ジェスチャーの検出ロジックをホロモンアプリにも組み込みました。
bluebirdofoz.hatenablog.com

首傾げの検出処理のスクリプトジェスチャー判定スクリプトへの参照を追加しています。
これにより、ホロモンがプレイヤーに注視しているときに頷きや首振りを検知します。
bluebirdofoz.hatenablog.com
・HeadObjectFeaturesSetter.cs

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

using System;

using UniRx;
using UniRx.Triggers;

using HMProject.HoloMon;

namespace HMProject.Player
{
    /// <summary>
    /// 顔の状態識別
    /// </summary>
    [Serializable]
    public enum HeadStatus
    {
        /// <summary>
        /// 無し(デフォルト)
        /// </summary>
        Nothing = 0,
        /// <summary>
        /// 頷く
        /// </summary>
        Nod,
        /// <summary>
        /// 首振り
        /// </summary>
        Shake,
        /// <summary>
        /// 首傾げ
        /// </summary>
        Tilt,
    }

    [RequireComponent(typeof(ObjectFeatures))]
    public class HeadObjectFeaturesSetter : MonoBehaviour
    {
        [SerializeField, Tooltip("通常状態のオブジェクト名")]
        private HoloMonKnownObjectFeatures p_NormalHeadName;

        [SerializeField, Tooltip("頷いた状態のオブジェクト名")]
        private HoloMonKnownObjectFeatures p_NodHeadName;

        [SerializeField, Tooltip("首を振る状態のオブジェクト名")]
        private HoloMonKnownObjectFeatures p_ShakeHeadName;

        [SerializeField, Tooltip("首を傾げた状態のオブジェクト名")]
        private HoloMonKnownObjectFeatures p_TiltHeadName;


        [SerializeField, Tooltip("現在の顔の状態")]
        private HeadStatus p_CurrentHeadStatus;


        [SerializeField, Tooltip("顔の状態判定ロジックの参照")]
        private HeadGestureRecognizer p_HeadGestureRecognizer;


        // オブジェクトの特徴の設定参照
        private ObjectFeatures p_ObjectFeatures;


        /// <summary>
        /// 起動処理
        /// </summary>
        void Start()
        {
            // オブジェクトの特徴の参照を取得する
            p_ObjectFeatures = this.gameObject.GetComponent<ObjectFeatures>();

            // 初期状態は通常状態
            SettingNormal();

            // 判定イベントを登録する
            p_HeadGestureRecognizer.EventNothing += SettingNormal;
            p_HeadGestureRecognizer.EventNod += SettingNod;
            p_HeadGestureRecognizer.EventShake += SettingShake;
            p_HeadGestureRecognizer.EventTilt += SettingTilt;
        }


        /// <summary>
        /// 状態を通常状態に設定する
        /// </summary>
        private void SettingNormal()
        {
            p_ObjectFeatures.Features = p_NormalHeadName;
            p_CurrentHeadStatus = HeadStatus.Nothing;
        }

        /// <summary>
        /// 状態を頷き状態に設定する
        /// </summary>
        private void SettingNod()
        {
            p_ObjectFeatures.Features = p_NodHeadName;
            p_CurrentHeadStatus = HeadStatus.Nod;
        }

        /// <summary>
        /// 状態を首振り状態に設定する
        /// </summary>
        private void SettingShake()
        {
            p_ObjectFeatures.Features = p_ShakeHeadName;
            p_CurrentHeadStatus = HeadStatus.Shake;
        }

        /// <summary>
        /// 状態を首傾げ状態に設定する
        /// </summary>
        private void SettingTilt()
        {
            p_ObjectFeatures.Features = p_TiltHeadName;
            p_CurrentHeadStatus = HeadStatus.Tilt;
        }
    }
}

プレイヤーを注視しているので HeadLookController の[Override Animation]にチェックを入れます。
これで注視による頭の移動とアニメーションの頷き動作がミックスされたアニメーションが再生されます。
f:id:bluebirdofoz:20210703235318j:plain
bluebirdofoz.hatenablog.com

動作確認

シーンを再生して動作を確認します。
ホロモンがこちらを見ているときに、頷く動作をするとホロモンも頷いてくれます。
f:id:bluebirdofoz:20210703235329j:plain

また、首を振る動作をするとホロモンも首を振ってくれました。
f:id:bluebirdofoz:20210703235345j:plain