public void SetIKKeyframes(float time, Avatar avatar, float humanScale, Vector3 bodyPosition, Quaternion bodyRotation) { // TODO Use character scale TQ IKTQ = AvatarUtility.GetIKGoalTQ(avatar, humanScale, goal, new TQ(bodyPosition, bodyRotation), new TQ(transform.position, transform.rotation)); Quaternion rot = IKTQ.q; if (lastQSet) { rot = BakerUtilities.EnsureQuaternionContinuity(lastQ, IKTQ.q); } //rot.Normalize(); lastQ = rot; lastQSet = true; rotX.AddKey(time, rot.x); rotY.AddKey(time, rot.y); rotZ.AddKey(time, rot.z); rotW.AddKey(time, rot.w); Vector3 pos = IKTQ.t; posX.AddKey(time, pos.x); posY.AddKey(time, pos.y); posZ.AddKey(time, pos.z); }
// Add curves to the AnimationClip for each channel public void SetCurves(ref AnimationClip clip, float maxError, float lengthMlp) { MultiplyLength(curve, lengthMlp); BakerUtilities.ReduceKeyframes(curve, maxError); // BakerUtilities.SetTangentMode(curve); clip.SetCurve(string.Empty, typeof(Animator), propertyName, curve); }
public void ReduceKeyframes(float maxError) { BakerUtilities.ReduceKeyframes(rotX, maxError); BakerUtilities.ReduceKeyframes(rotY, maxError); BakerUtilities.ReduceKeyframes(rotZ, maxError); BakerUtilities.ReduceKeyframes(rotW, maxError); BakerUtilities.ReduceKeyframes(posX, maxError); BakerUtilities.ReduceKeyframes(posY, maxError); BakerUtilities.ReduceKeyframes(posZ, maxError); }
// Add a copy of the first frame to the specified time public void SetLoopFrame(float time) { BakerUtilities.SetLoopFrame(time, rotX); BakerUtilities.SetLoopFrame(time, rotY); BakerUtilities.SetLoopFrame(time, rotZ); BakerUtilities.SetLoopFrame(time, rotW); BakerUtilities.SetLoopFrame(time, posX); BakerUtilities.SetLoopFrame(time, posY); BakerUtilities.SetLoopFrame(time, posZ); }
private void UpdateHumanPose() { handler.GetHumanPose(ref pose); bodyPosition = pose.bodyPosition; bodyRotation = pose.bodyRotation; bodyRotation = BakerUtilities.EnsureQuaternionContinuity(lastBodyRotation, bodyRotation); lastBodyRotation = bodyRotation; for (int i = 0; i < pose.muscles.Length; i++) { muscles[i] = pose.muscles[i]; } }
// Add curves to the AnimationClip for each channel public void SetCurves(ref AnimationClip clip, float maxError, float lengthMlp) { MultiplyLength(rotX, lengthMlp); MultiplyLength(rotY, lengthMlp); MultiplyLength(rotZ, lengthMlp); MultiplyLength(rotW, lengthMlp); MultiplyLength(posX, lengthMlp); MultiplyLength(posY, lengthMlp); MultiplyLength(posZ, lengthMlp); BakerUtilities.ReduceKeyframes(rotX, maxError); BakerUtilities.ReduceKeyframes(rotY, maxError); BakerUtilities.ReduceKeyframes(rotZ, maxError); BakerUtilities.ReduceKeyframes(rotW, maxError); BakerUtilities.ReduceKeyframes(posX, maxError); BakerUtilities.ReduceKeyframes(posY, maxError); BakerUtilities.ReduceKeyframes(posZ, maxError); BakerUtilities.SetTangentMode(rotX); BakerUtilities.SetTangentMode(rotY); BakerUtilities.SetTangentMode(rotZ); BakerUtilities.SetTangentMode(rotW); /* * BakerUtilities.SetTangentMode(posX); * BakerUtilities.SetTangentMode(posY); * BakerUtilities.SetTangentMode(posZ); */ clip.SetCurve(string.Empty, typeof(Animator), Qx, rotX); clip.SetCurve(string.Empty, typeof(Animator), Qy, rotY); clip.SetCurve(string.Empty, typeof(Animator), Qz, rotZ); clip.SetCurve(string.Empty, typeof(Animator), Qw, rotW); clip.SetCurve(string.Empty, typeof(Animator), Tx, posX); clip.SetCurve(string.Empty, typeof(Animator), Ty, posY); clip.SetCurve(string.Empty, typeof(Animator), Tz, posZ); }
public void SetIKKeyframes(float time, Avatar avatar, Transform root, float humanScale, Vector3 bodyPosition, Quaternion bodyRotation) { Vector3 bonePos = transform.position; Quaternion boneRot = transform.rotation; if (root.parent != null) { bonePos = root.parent.InverseTransformPoint(bonePos); boneRot = Quaternion.Inverse(root.parent.rotation) * boneRot; } TQ IKTQ = AvatarUtility.GetIKGoalTQ(avatar, humanScale, goal, new TQ(bodyPosition, bodyRotation), new TQ(bonePos, boneRot)); Quaternion rot = IKTQ.q; if (lastQSet) { rot = BakerUtilities.EnsureQuaternionContinuity(lastQ, IKTQ.q); } //rot.Normalize(); lastQ = rot; lastQSet = true; rotX.AddKey(time, rot.x); rotY.AddKey(time, rot.y); rotZ.AddKey(time, rot.z); rotW.AddKey(time, rot.w); Vector3 pos = IKTQ.t; posX.AddKey(time, pos.x); posY.AddKey(time, pos.y); posZ.AddKey(time, pos.z); }
// Add a copy of the first frame to the specified time public void SetLoopFrame(float time) { BakerUtilities.SetLoopFrame(time, curve); }