MRが楽しい

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

HoloLens2でホロモンアプリを作る その11(オブジェクトの回転速度を計算する)

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

以下の記事でホロモンの姿勢をこちらに向ける実装を行いました。
bluebirdofoz.hatenablog.com

今回はオブジェクトの回転速度を計算してアニメーションに反映するメモです。

float値に合わせてアニメーションを切り替える

既に float 値に合わせてアニメーションを切り替える部分については以下の記事で実装方法を紹介ししました。
bluebirdofoz.hatenablog.com

今回はこの記事の手順で、回転角度の値に合わせて回転アニメーションを再生する Blend Tree を設定しました。
f:id:bluebirdofoz:20210227221212j:plain

回転量を取得する

オブジェクトの回転速度は Rigidbody の angularVelocity から取得可能です。
docs.unity3d.com

以下のようなコードで速度に応じた速度の変更が可能です。
・HoloMonModeLogicPlayerTurn.cs

/// <summary>
/// 定期処理
/// </summary>
void Update()
{
        // RigidbodyからangularVelocityの速度量を取得する
        float angularVelocity = p_Rigidbody.angularVelocity.magnitude;

        // 0.0f ~ 1.0fの範囲で適切なアニメーションが再生されるよう値を補正する
        float rotateValue = angularVelocity * 100000.0f;

        // 回転速度をアニメーションに通知する
        HoloMonAnimationSingleton.Instance.SetModelRotate(rotateValue);

ただし、この方法では取得できる値が小さく調整が直感的に行えなかったため、以下の Quaternion.Angle で1フレーム当たりの角度変化を取得し、1秒当たりの回転量から計算する形に変更しました。
docs.unity3d.com

・HoloMonModeLogicPlayerTurn.cs

/// <summary>
/// 定期処理
/// </summary>
void Update()
{
        // 現在の回転角を取得する
        Quaternion currentRotation = p_Rigidbody.transform.rotation;

        // 前回との差分を取得する
        float diffAngle = Quaternion.Angle(p_BeforeRotation, currentRotation);

        // Update間隔の係数を取得する
        float secCoefficient = 1.0f / Time.deltaTime;

        // 1秒あたりの回転速度を取得する
        float secAngle = diffAngle * secCoefficient;

        // 回転速度をアニメーションに通知する
        HoloMonAnimationSingleton.Instance.SetModelRotate(secAngle);

        // 最終的な回転角を記録する
        p_BeforeRotation = p_Rigidbody.transform.rotation;

f:id:bluebirdofoz:20210227221245j:plain

スクリプトをアタッチして動作を確認します。
f:id:bluebirdofoz:20210227221255j:plain

ホロモンがこちらに向く時にアニメーションが再生されれば成功です。
f:id:bluebirdofoz:20210227221304j:plain