1 using System.Collections;
2 using System.Collections.Generic;
12 [RequireComponent(typeof(Animator))]
24 public Transform headTransform;
29 public Transform neckTransform;
34 public bool switchAxisXZ =
true;
39 public bool swap_feet =
false;
41 private Animator animator;
42 private bool IKPass_is_enabled =
false;
47 public bool autoLayerBlend =
false;
52 [AVR.Core.Attributes.ConditionalHideInInspector(
"autoLayerBlend",
true)]
53 public string speedAnimationParameter =
"Speed";
59 public float layerBlend_speed = 5.0f;
60 private float layerBlend = 1.0f;
63 public float lookAtWeight_body = 0.0f;
65 public float lookAtWeight_head = 1.0f;
67 public float lookAtWeight_eyes = 1.0f;
69 public float lookAtWeight_clamp = 0.0f;
71 public float lookAtWeight = 1.0f;
73 public float HandPosWeight = 1.0f;
75 public float HandRotWeight = 0.5f;
77 public float FootPosWeight = 1.0f;
79 public float FootRotWeight = 1.0f;
81 protected override void Start() {
83 animator = GetComponent<Animator>();
84 if(!animator.avatar) {
85 AVR.Core.AVR_DevConsole.warn(
"AVR_PoseAssumer requires an Animator component WITH an Avatar set. " + animator.name +
" has none.");
87 Invoke(
"CheckIKPass", 3.0f);
89 animator.logWarnings =
false;
93 if(!IKPass_is_enabled) {
94 AVR.Core.AVR_DevConsole.warn(
"The OnAnimatorIK() method of AVR_PoseAssumer " + gameObject.name +
" is not being called. Does the respective Animator have IKPass enabled on any layers?");
99 if(!headTransform || !neckTransform) {
100 AVR.Core.AVR_DevConsole.cwarn(
"headTransform and neckTransform are not set!",
this);
104 Vector3 headAng = headTransform.eulerAngles;
105 Vector3 neckAng = neckTransform.eulerAngles;
106 float ang = Mathf.DeltaAngle(360.0f, provider.eyeRot.eulerAngles.z);
110 neckAng.x = ang * 0.5f;
115 neckAng.z = ang * 0.5f;
117 headTransform.eulerAngles = headAng;
118 neckTransform.eulerAngles = neckAng;
123 if (!playerRig)
return;
128 layerBlend = Mathf.Lerp(layerBlend, Mathf.SmoothStep(1.0f, 0.0f, playerRig.AvgMotion.magnitude), layerBlend_speed * Time.deltaTime);
133 float layerWeight = animator.GetLayerWeight(layerIndex);
135 animator.SetLookAtWeight(lookAtWeight*layerWeight, lookAtWeight_body*layerWeight, lookAtWeight_head*layerWeight, lookAtWeight_eyes*layerWeight, lookAtWeight_clamp*layerWeight);
136 animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, HandPosWeight*layerWeight);
137 animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, HandRotWeight*layerWeight);
138 animator.SetIKPositionWeight(AvatarIKGoal.RightHand, HandPosWeight*layerWeight);
139 animator.SetIKRotationWeight(AvatarIKGoal.RightHand, HandRotWeight*layerWeight);
140 animator.SetIKPositionWeight(AvatarIKGoal.LeftFoot, FootPosWeight*layerWeight);
141 animator.SetIKRotationWeight(AvatarIKGoal.LeftFoot, FootRotWeight*layerWeight);
142 animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, FootPosWeight*layerWeight);
143 animator.SetIKRotationWeight(AvatarIKGoal.RightFoot, FootRotWeight*layerWeight);
147 float layerWeight = animator.GetLayerWeight(layerIndex);
150 animator.SetLookAtPosition(transform.TransformPoint(provider.lookAtPos));
153 animator.bodyPosition = transform.TransformPoint(provider.bodyPos);
154 animator.bodyRotation = transform.rotation * provider.bodyRot;
156 if(playerRig.leftHandController!=null)
158 animator.SetIKPosition(AvatarIKGoal.LeftHand, transform.TransformPoint(provider.leftHandPos));
159 animator.SetIKRotation(AvatarIKGoal.LeftHand, transform.rotation * provider.leftHandRot);
161 if(playerRig.rightHandController != null)
163 animator.SetIKPosition(AvatarIKGoal.RightHand, transform.TransformPoint(provider.rightHandPos));
164 animator.SetIKRotation(AvatarIKGoal.RightHand, transform.rotation * provider.rightHandRot);
168 animator.SetIKPosition(AvatarIKGoal.LeftFoot, transform.TransformPoint(provider.leftFootPos));
169 animator.SetIKRotation(AvatarIKGoal.LeftFoot, transform.rotation * provider.leftFootRot);
170 animator.SetIKPosition(AvatarIKGoal.RightFoot, transform.TransformPoint(provider.rightFootPos));
171 animator.SetIKRotation(AvatarIKGoal.RightFoot, transform.rotation * provider.rightFootRot);
174 animator.SetIKPosition(AvatarIKGoal.LeftFoot, transform.TransformPoint(provider.rightFootPos));
175 animator.SetIKRotation(AvatarIKGoal.LeftFoot, transform.rotation * provider.rightFootRot);
176 animator.SetIKPosition(AvatarIKGoal.RightFoot, transform.TransformPoint(provider.leftFootPos));
177 animator.SetIKRotation(AvatarIKGoal.RightFoot, transform.rotation * provider.leftFootRot);
183 IKPass_is_enabled =
true;
186 if (!playerRig)
return;
189 setPosRot(layerIndex);
193 animator.SetFloat(speedAnimationParameter, playerRig.AvgMotion.magnitude);
194 animator.SetLayerWeight(layerIndex, layerBlend);
195 Vector3 defaultBodyPos = transform.TransformPoint(provider.pivotPos + Vector3.up * 1.0f);
196 animator.bodyPosition = Vector3.Lerp(defaultBodyPos, animator.bodyPosition, layerBlend);
197 animator.bodyRotation = Quaternion.Lerp(
199 transform.rotation * Quaternion.LookRotation(playerRig.AvgMotion + 0.0001f*Vector3.forward, Vector3.up),
200 animator.bodyRotation,
205 setWeights(layerIndex);
Applies a pose provided by an AVR_PosePorvider to a rigged 3d model with an avatar.
Estimates the pose of a player from the locations of VR controllers and HMD
void setPosRot(int layerIndex)
void setWeights(int layerIndex)
void OnAnimatorIK(int layerIndex)
Sets the documentation html file inside of Packages/com.avr.core/Documentation/html of a given class...
Assigns given attributes to a foldout group in the inspector. The way these are drawn is determined b...
Allows for simple hiding of properties in the UnityEditor depending on certain conditions. For instance, in the following example the "type" field will only be displayed in the inspector if the "tracking" field is set to true: