public static RigidTransform GetTrackOffsets(AnimationTrack track, Transform transform) { Vector3 position = track.position; Quaternion rotation = track.rotation; if (transform != null && transform.parent != null) { position = transform.parent.TransformPoint(position); rotation = transform.parent.rotation * rotation; MathUtils.QuaternionNormalize(ref rotation); } return(RigidTransform.Compose(position, rotation)); }
// Given a world space position and rotation, updates the clip offsets to match that public static RigidTransform UpdateClipOffsets(AnimationPlayableAsset asset, AnimationTrack track, Transform transform, Vector3 globalPosition, Quaternion globalRotation) { Matrix4x4 worldToLocal = transform.worldToLocalMatrix; Matrix4x4 clipMatrix = Matrix4x4.TRS(asset.position, asset.rotation, Vector3.one); Matrix4x4 trackMatrix = GetTrackMatrix(transform, track); // Use the transform to find the proper goal matrix with scale taken into account var oldPos = transform.position; var oldRot = transform.rotation; transform.position = globalPosition; transform.rotation = globalRotation; Matrix4x4 goal = transform.localToWorldMatrix; transform.position = oldPos; transform.rotation = oldRot; // compute the new clip matrix. Matrix4x4 newClip = trackMatrix.inverse * goal * worldToLocal * trackMatrix * clipMatrix; return(RigidTransform.Compose(newClip.GetColumn(3), MathUtils.QuaternionFromMatrix(newClip))); }