102 lines
3.3 KiB
C#
102 lines
3.3 KiB
C#
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace BNG {
|
||
|
|
||
|
/// <summary>
|
||
|
/// This class can be used to map finger rotations from one model to another
|
||
|
/// </summary>
|
||
|
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];
|
||
|
}
|
||
|
}
|
||
|
|