using System.Collections; using System.Collections.Generic; using UnityEngine; namespace BNG { /// /// This class can be used to map finger rotations from one model to another /// public class BoneMapping : MonoBehaviour { [Range(0f, 1f)] public float Weight = 1f; public BoneObject[] Fingers; [Header("Shown for Debug : ")] public bool ShowGizmos = true; void Update() { if (Weight <= 0f) { return; } for (int x = 0; x < Fingers.Length; x++) { BoneObject finger = Fingers[x]; if (finger == null) { continue; } for (int i = 0; i < finger.destinationBones.Length - 1; i++) { // Get the relative rotation from the current rotation to the target rotation Quaternion f = Quaternion.Inverse(finger.destinationBones[i].rotation) * finger.targetBones[i].rotation; // Weight blending if (Weight < 1f) { f = Quaternion.Slerp(Quaternion.identity, f, Weight); } // Append relative rotation finger.destinationBones[i].rotation *= f; } } } void OnDrawGizmos() { if (!ShowGizmos || Fingers == null) { return; } for (int x = 0; x < Fingers.Length; x++) { BoneObject finger = Fingers[x]; for (int i = 0; i < finger.targetBones.Length; i++) { if(finger.targetBones[i] == null) { continue; } // Target Bones Gizmos.color = Color.red; Gizmos.DrawSphere(finger.targetBones[i].position, 0.003f); if (i < finger.targetBones.Length - 1) { if(finger.targetBones[i] == null || finger.targetBones[i + 1] == null) { continue; } Gizmos.DrawLine(finger.targetBones[i].position, finger.targetBones[i + 1].position); } } for (int i = 0; i < finger.destinationBones.Length; i++) { // Reference may have been removed from inspector if (finger.destinationBones[i] == null) { continue; } // Avatar Bones Gizmos.color = Color.yellow; Gizmos.DrawSphere(finger.destinationBones[i].position, 0.003f); if (i < finger.destinationBones.Length - 1) { if (finger.destinationBones[i] == null || finger.destinationBones[i + 1] == null) { continue; } Gizmos.DrawLine(finger.destinationBones[i].position, finger.destinationBones[i + 1].position); } } } } } [System.Serializable] public class BoneObject { public Transform[] targetBones = new Transform[0]; public Transform[] destinationBones = new Transform[0]; } }