本日はアプリ作成枠です。
HoloLens2でホロモンアプリを作る進捗を書き留めていきます。
以下の記事でホロモンの姿勢をこちらに向ける実装を行いました。
bluebirdofoz.hatenablog.com
今回はオブジェクトの回転速度を計算してアニメーションに反映するメモです。
float値に合わせてアニメーションを切り替える
既に float 値に合わせてアニメーションを切り替える部分については以下の記事で実装方法を紹介ししました。
bluebirdofoz.hatenablog.com
今回はこの記事の手順で、回転角度の値に合わせて回転アニメーションを再生する Blend Tree を設定しました。
回転量を取得する
オブジェクトの回転速度は 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;
スクリプトをアタッチして動作を確認します。
ホロモンがこちらに向く時にアニメーションが再生されれば成功です。