/// <summary> /// Computing variables making Quaternion.Look universal for different skeletonal setups /// </summary> private void ComputeBonesRotationsFixVariables() { if (BaseTransform != null) { Quaternion preRot = BaseTransform.rotation; BaseTransform.rotation = Quaternion.identity; FromAuto = LeadBone.rotation * -Vector3.forward; float angl = Quaternion.Angle(Quaternion.identity, LeadBone.rotation); Quaternion rotateAxis = (LeadBone.rotation * Quaternion.Inverse(Quaternion.FromToRotation(FromAuto, ModelForwardAxis))); OffsetAuto = Quaternion.AngleAxis(angl, rotateAxis.eulerAngles.normalized).eulerAngles; BaseTransform.rotation = preRot; parentalReferenceLookForward = Quaternion.Inverse(LeadBone.parent.rotation) * BaseTransform.rotation * ModelForwardAxis.normalized; parentalReferenceUp = Quaternion.Inverse(LeadBone.parent.rotation) * BaseTransform.rotation * ModelUpAxis.normalized; headForward = Quaternion.FromToRotation(LeadBone.InverseTransformDirection(BaseTransform.TransformDirection(ModelForwardAxis.normalized)), Vector3.forward) * Vector3.forward; } else { Debug.LogWarning("Base Transform isn't defined, so we can't use auto correction!"); } }
private void Gizmos_DrawBones() { if (LeadBone == null) { return; } Color c = Handles.color; Color boneColor = new Color(0.075f, .85f, 0.3f, gizmosAlpha * 0.7f); Handles.color = boneColor; Vector3 f = BaseTransform.TransformDirection(ModelForwardAxis); if (LeadBone.childCount > 0) { FGUI_Handles.DrawBoneHandle(LeadBone.position, LeadBone.position + BaseTransform.TransformDirection(ModelUpAxis) * Vector3.Distance(LeadBone.position, LeadBone.parent.position) / 2f, f); } if (LookBones.Count > 0) { // Drawing back-bones for (int i = 1; i < LookBones.Count; i++) { if (LookBones[i].Transform != null) { if (LookBones[i] == null) { continue; } FGUI_Handles.DrawBoneHandle(LookBones[i].Transform.position, LookBones[i - 1].Transform.position, f); } } if (LookBones.Count > 1) { FGUI_Handles.DrawBoneHandle(LookBones[1].Transform.position, LeadBone.position, f); } } Handles.SphereHandleCap(0, LeadBone.position, Quaternion.identity, _gizmosDist * 0.025f, EventType.Repaint); for (int i = 0; i < LeadBone.childCount; i++) { Handles.color = new Color(0.8f, .8f, 0.8f, gizmosAlpha * 0.25f); Handles.DrawDottedLine(LeadBone.position, LeadBone.GetChild(i).position, 2.5f); Handles.color = new Color(0.8f, .8f, 0.8f, gizmosAlpha * 0.1f); Handles.SphereHandleCap(0, LeadBone.GetChild(i).position, Quaternion.identity, _gizmosDist * 0.01f, EventType.Repaint); } if (LookBones.Count > 1) { if (LookBones[LookBones.Count - 1].Transform.parent) { Handles.color = new Color(0.8f, .8f, 0.8f, gizmosAlpha * 0.25f); Handles.DrawDottedLine(LookBones[LookBones.Count - 1].Transform.position, LookBones[LookBones.Count - 1].Transform.parent.position, 3f); Handles.color = new Color(0.8f, .8f, 0.8f, gizmosAlpha * 0.1f); Handles.SphereHandleCap(0, LookBones[LookBones.Count - 1].Transform.parent.position, Quaternion.identity, _gizmosDist * 0.01f, EventType.Repaint); } } Handles.color = c; }