前提・実現したいこと
Unity初心者になります。初めての質問失礼いたします。
3Dモデルのモーションデータをデフォルメし、制御することを可能にするためのアプリケーションを開発しています。
現在はモーションを制御する際に全ての関節角度やスピードに変形を加えているのですが、関節ごとに変形を制御できるようにしたいと思っております。
ex)モーションデータにおける、
右肘の角度の大きさ1.5, 右肩の角度の大きさ1.2
のように、それぞれ独立して制御を可能にしたいと思っています。
試したこと
モーションデータのの全ての関節角度、モーションスピードを変数で変形させました。
実際のコード
このように変数に応じて、モーションの全関節角度の大きさと
using System.Collections; using System.Collections.Generic; using UnityEngine; namespace AmplifyAnimation { [RequireComponent(typeof(Animator))] public class MotionDSfin : MonoBehaviour { public bool applyRootMotion = true; [Range(0.7f, 1.3f)] public float amplitude = 1.0f; private Animator animator; private HumanPoseHandler poseHandler; private HumanPose pose; private Vector3 rootPosition; private Quaternion rootRotation; private float[] initialMuscles; private void Awake() { this.animator = this.GetComponent<Animator>(); // ポーズを取得・操作するためのハンドラーを取得する this.poseHandler = new HumanPoseHandler(this.animator.avatar, this.transform); // 初期状態でのマッスル値を覚えておき、これを基準の姿勢とする var t = this.transform; this.rootPosition = t.position; this.rootRotation = t.rotation; t.SetPositionAndRotation(Vector3.zero, Quaternion.identity); this.poseHandler.GetHumanPose(ref this.pose); t.SetPositionAndRotation(this.rootPosition, this.rootRotation); this.initialMuscles = this.pose.muscles.Clone() as float[]; } private void OnAnimatorMove() { var t = this.transform; this.rootPosition = t.position; this.rootRotation = t.rotation; if (!this.applyRootMotion) { return; } // もしルートモーションの適用が必要なら、このタイミングで処理しておく // このとき、動く量をamplitudeに応じて増減させる amplitude = 1.0f + IFMScaredD.getFavsd() / 3; var deltaPosition = Vector3.LerpUnclamped( Vector3.zero, this.animator.deltaPosition, this.amplitude); var deltaRotation = Quaternion.SlerpUnclamped( Quaternion.identity, this.animator.deltaRotation, this.amplitude); this.rootPosition += deltaPosition; this.rootRotation = deltaRotation * this.rootRotation; } private void LateUpdate() { var t = this.transform; // Animatorが設定した現在のポーズを取得し... t.SetPositionAndRotation(Vector3.zero, Quaternion.identity); this.poseHandler.GetHumanPose(ref this.pose); t.SetPositionAndRotation(this.rootPosition, this.rootRotation); // 初期ポーズとの差分をamplitudeに応じて増幅して... amplitude = 1.0f + IFMScaredD.getFavsd() / 2; var muscles = this.pose.muscles; for (var i = 0; i < muscles.Length; i++) { muscles[i] = Mathf.LerpUnclamped(this.initialMuscles[i], muscles[i], this.amplitude); } // 修正したポーズを適用する this.poseHandler.SetHumanPose(ref this.pose); } } }
追記:
モーションのスピードに関してのコードが抜けていたので追記させていただきます。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class motionSpeedSD: MonoBehaviour { public float speed; Animator m_Animator; // Start is called before the first frame update void Start() { m_Animator = gameObject.GetComponent<Animator>(); } // Update is called once per frame void Update() { m_Animator.speed = 1.0f + IFMScaredD.getFavsd() / 2; } }
補足情報(FW/ツールのバージョンなど)
Unityのバージョン:2019.4.3f1
使用しているスクリプト:fungus
3Dモデル:ユニティちゃん
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。