MRが楽しい

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

HoloLens2でホロモンアプリを作る その8(HeadLookControllerのOverrideAnimationの変更をスムーズに行う)

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

HeadLookControllerのOverrideAnimationの変更をスムーズに行うためのメモです。

前提条件

前回記事の続きです。
bluebirdofoz.hatenablog.com

HeadLookControllerのOverrideAnimationの変更をスムーズに行う

前回記事では HeadLookController の[OverrideAnimation]をスクリプトから変更すると、スムーズなモーション変化にならないため、スクリプトからの変更を断念しました。
今回は HeadLookController.cs 自体を改修することで問題を回避できたので変更内容を残して置きます。

スムーズにモーション変化を繋げるため、回転量の変化を以下の Lerp 関数を使って補間しました。
docs.unity3d.com

HeadLookController.cs を改修し、以下の HeadLookControllerSmooth.cs スクリプトを作成しました。
修正箇所を抜粋します。
・HeadLookControllerSmooth.cs

using UnityEngine;
using System.Collections;

public class HeadLookControllerSmooth : MonoBehaviour {
    // ..略..
    
    // overrideAnimationの線形補間用のパラメータを追加
    public float overrideAnimationFloat = 0.0f;
    public float overrideAnimationFrameDiff = 0.01f;

    void Start()
    {
        // ..略..

        if (overrideAnimation)
        {
            // overrideAnimationの線形補間用のパラメータ
            // ON の場合は補正を完全に有効化する
            overrideAnimationFloat = 1.0f;
        }
        else
        {
            // overrideAnimationの線形補間用のパラメータ
            // OFF の場合は補正を完全に無効化する
            overrideAnimationFloat = 0.0f;
        }
    }

    void LateUpdate () {
        // ..略..

        // Handle each segment
        foreach (BendingSegment segment in segments) {
            Transform t = segment.lastTransform;

            // overrideAnimationの線形補間用のパラメータ
            if (overrideAnimation)
            {
                // ON の場合は1.0fになるまで徐々に補正を強くしていく
                if (overrideAnimationFloat < 1.0f)
                {
                    overrideAnimationFloat += overrideAnimationFrameDiff;
                }
                else
                {
                    overrideAnimationFloat = 1.0f;
                }
            }
            else
            {
                // OFF の場合は0.0fになるまで徐々に補正を弱くしていく
                if (overrideAnimationFloat > 0.0f)
                {
                    overrideAnimationFloat -= overrideAnimationFrameDiff;
                }
                else
                {
                    overrideAnimationFloat = 0.0f;
                }
            }
            // overrideAnimationの線形補間用のパラメータ
            // 補正値に基づいて ON/OFF 状態の線形補完を行う
            //if (overrideAnimation) {
            for (int i=segment.chainLength-1; i>=0; i--) {
                t.localRotation = Quaternion.Lerp(t.localRotation, segment.origRotations[i], overrideAnimationFloat);
                t = t.parent;
            }
            //}

        // ..略..

f:id:bluebirdofoz:20210223041604j:plain

スクリプトを差し替えて利用します。
f:id:bluebirdofoz:20210223041614j:plain

動作確認

シーンを再生して確認します。
初期状態では[OverrideAnimation]を OFF にした状態で視線追従しておらず、元のアニメーションが再生される状態になっています。
f:id:bluebirdofoz:20210223041622j:plain

スクリプトから視線追従を有効にして[OverrideAnimation]を ON にさせます。
元のアニメーションが完全に視線追従に上書きされ、その上で視線追従の遷移がスムーズに行われれば成功です。
f:id:bluebirdofoz:20210223041632j:plain