/// <summary> /// Initialize Curve manipulation for Rigs /// </summary> public CurveManipulation(GameObject target, RigGoalController controller, int frame, Transform mouthpiece, AnimationTool.CurveEditMode manipMode, int zoneSize, double tangentContinuity) { isHuman = true; manipulationMode = manipMode; initialMouthMatrix = mouthpiece.worldToLocalMatrix; Frame = frame; Target = target; continuity = tangentContinuity; List <AnimationSet> previousSets = new List <AnimationSet>(); controller.AnimToRoot.ForEach(x => { if (null != x) { previousSets.Add(new AnimationSet(x)); } }); humanData = new HumanData() { Animations = previousSets, Controller = controller, ObjectAnimation = new AnimationSet(controller.Animation), InitFrameMatrix = controller.MatrixAtFrame(frame) }; if (manipulationMode == AnimationTool.CurveEditMode.Segment) { startFrame = frame - zoneSize; endFrame = frame + zoneSize; AddSegmentHierarchy(controller, frame); AddSegmentKeyframes(frame, controller.Animation); } if (manipulationMode == AnimationTool.CurveEditMode.Tangents) { startFrame = humanData.ObjectAnimation.GetCurve(AnimatableProperty.RotationX).GetPreviousKeyFrame(frame); endFrame = humanData.ObjectAnimation.GetCurve(AnimatableProperty.RotationX).GetNextKeyFrame(frame); } }
/// <summary> /// Initialize Curve Manipulation for objects /// </summary> public CurveManipulation(GameObject target, int frame, Transform mouthpiece, AnimationTool.CurveEditMode manipMode, int zoneSize, double tanCont) { isHuman = false; manipulationMode = manipMode; AnimationSet previousSet = GlobalState.Animation.GetObjectAnimation(target); initialMouthMatrix = mouthpiece.worldToLocalMatrix; Target = target; Frame = frame; continuity = tanCont; if (!previousSet.GetCurve(AnimatableProperty.PositionX).Evaluate(frame, out float posx)) { posx = target.transform.localPosition.x; } if (!previousSet.GetCurve(AnimatableProperty.PositionY).Evaluate(frame, out float posy)) { posy = target.transform.localPosition.y; } if (!previousSet.GetCurve(AnimatableProperty.PositionZ).Evaluate(frame, out float posz)) { posz = target.transform.localPosition.z; } if (!previousSet.GetCurve(AnimatableProperty.RotationX).Evaluate(frame, out float rotx)) { rotx = target.transform.localEulerAngles.x; } if (!previousSet.GetCurve(AnimatableProperty.RotationY).Evaluate(frame, out float roty)) { roty = target.transform.localEulerAngles.y; } if (!previousSet.GetCurve(AnimatableProperty.RotationZ).Evaluate(frame, out float rotz)) { rotz = target.transform.localEulerAngles.z; } if (!previousSet.GetCurve(AnimatableProperty.ScaleX).Evaluate(frame, out float scax)) { scax = target.transform.localScale.x; } if (!previousSet.GetCurve(AnimatableProperty.ScaleY).Evaluate(frame, out float scay)) { scay = target.transform.localScale.y; } if (!previousSet.GetCurve(AnimatableProperty.ScaleZ).Evaluate(frame, out float scaz)) { scaz = target.transform.localScale.z; } Vector3 initialPosition = new Vector3(posx, posy, posz); Quaternion initialRotation = Quaternion.Euler(rotx, roty, rotz); Vector3 initialScale = new Vector3(scax, scay, scaz); objectData = new ObjectData() { Animation = new AnimationSet(previousSet), InitialParentMatrix = target.transform.parent.localToWorldMatrix, InitialParentMatrixWorldToLocal = target.transform.parent.worldToLocalMatrix, InitialTRS = Matrix4x4.TRS(initialPosition, initialRotation, initialScale), ScaleIndice = 1f }; if (manipulationMode == AnimationTool.CurveEditMode.Zone) { startFrame = frame - zoneSize; endFrame = frame + zoneSize; } if (manipulationMode == AnimationTool.CurveEditMode.Segment) { startFrame = frame - zoneSize; endFrame = frame + zoneSize; AddSegmentKeyframes(frame, previousSet); } if (manipMode == AnimationTool.CurveEditMode.Tangents) { startFrame = objectData.Animation.GetCurve(AnimatableProperty.PositionX).GetPreviousKeyFrame(frame); endFrame = objectData.Animation.GetCurve(AnimatableProperty.PositionX).GetNextKeyFrame(frame); } }