public void DampedTransform_TransferMotionToSkeleton() { var data = DampedTransformTests.SetupConstraintRig(); var constraint = data.constraint; var rootGO = data.rigData.rootGO; var rigBuilder = rootGO.GetComponent <RigBuilder>(); var constrainedObject = constraint.data.constrainedObject; var sourceObject = constraint.data.sourceObject; var clip = new AnimationClip(); var constrainedObjectPath = AnimationUtility.CalculateTransformPath(constrainedObject, rootGO.transform); var sourceObjectPath = AnimationUtility.CalculateTransformPath(sourceObject, rootGO.transform); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(sourceObjectPath, typeof(Transform), "m_LocalPosition.x"), AnimationCurve.Linear(0f, sourceObject.localPosition.x, 1f, sourceObject.localPosition.y + 0.5f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(sourceObjectPath, typeof(Transform), "m_LocalPosition.y"), AnimationCurve.Linear(0f, sourceObject.localPosition.y, 1f, sourceObject.localPosition.y + 2.5f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(sourceObjectPath, typeof(Transform), "m_LocalPosition.z"), AnimationCurve.Linear(0f, sourceObject.localPosition.z, 1f, sourceObject.localPosition.y + 4.5f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(sourceObjectPath, typeof(Transform), "localEulerAnglesRaw.x"), AnimationCurve.Linear(0f, -50f, 1f, 50f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(sourceObjectPath, typeof(Transform), "localEulerAnglesRaw.y"), AnimationCurve.Constant(0f, 1f, 0f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(sourceObjectPath, typeof(Transform), "localEulerAnglesRaw.z"), AnimationCurve.Constant(0f, 1f, 0f)); RuntimeRiggingEditorTestFixture.TestTransferMotionToSkeleton(constraint, rigBuilder, clip, new Transform[] { constrainedObject }, CompareFlags.TR); }
public void TwistChainConstraint_TransferMotionToSkeleton() { var data = TwistChainConstraintTests.SetupConstraintRig(); var constraint = data.constraint; var rootGO = data.rigData.rootGO; var rigBuilder = rootGO.GetComponent <RigBuilder>(); var tip = constraint.data.tip; var root = constraint.data.root; var tipTarget = constraint.data.tipTarget; var rootTarget = constraint.data.rootTarget; var clip = new AnimationClip(); var tipTargetPath = AnimationUtility.CalculateTransformPath(tipTarget, rootGO.transform); var rootTargetPath = AnimationUtility.CalculateTransformPath(rootTarget, rootGO.transform); // Add keyframes for twist chain constraint. AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(rootTargetPath, typeof(Transform), "localEulerAnglesRaw.x"), AnimationCurve.Constant(0f, 1f, 0f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(rootTargetPath, typeof(Transform), "localEulerAnglesRaw.y"), AnimationCurve.Constant(0f, 1f, 0f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(rootTargetPath, typeof(Transform), "localEulerAnglesRaw.z"), AnimationCurve.Linear(0f, 0f, 1f, -50f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(tipTargetPath, typeof(Transform), "localEulerAnglesRaw.x"), AnimationCurve.Constant(0f, 1f, 0f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(tipTargetPath, typeof(Transform), "localEulerAnglesRaw.y"), AnimationCurve.Constant(0f, 1f, 0f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(tipTargetPath, typeof(Transform), "localEulerAnglesRaw.z"), AnimationCurve.Linear(0f, 0f, 1f, 50f)); RuntimeRiggingEditorTestFixture.TestTransferMotionToSkeleton(constraint, rigBuilder, clip, ConstraintsUtils.ExtractChain(root, tip), CompareFlags.TR); }
public void MultiReferentialConstraint_TransferMotionToConstraint() { var data = MultiReferentialConstraintTests.SetupConstraintRig(); var constraint = data.constraint; var rootGO = data.rigData.rootGO; var rigBuilder = rootGO.GetComponent <RigBuilder>(); var sources = constraint.data.sourceObjects; var clip = new AnimationClip(); var src0 = sources[0]; var constraintPath = AnimationUtility.CalculateTransformPath(constraint.transform, rootGO.transform); var src0Path = AnimationUtility.CalculateTransformPath(src0, rootGO.transform); var driverAttribute = ((IMultiReferentialConstraintData)constraint.data).driverIntProperty; var driverCurve = new AnimationCurve(new Keyframe[] { new Keyframe(0f, 0f), new Keyframe(0.33f, 1f, Mathf.Infinity, Mathf.Infinity), new Keyframe(0.66f, 2f, Mathf.Infinity, Mathf.Infinity), new Keyframe(1f, 2f) }); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(constraintPath, typeof(MultiReferentialConstraint), driverAttribute), driverCurve); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(src0Path, typeof(Transform), "m_LocalPosition.x"), AnimationCurve.Linear(0f, -0.5f, 1f, 0.5f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(src0Path, typeof(Transform), "m_LocalPosition.y"), AnimationCurve.Linear(0f, -1.5f, 1f, 1.5f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(src0Path, typeof(Transform), "m_LocalPosition.z"), AnimationCurve.Linear(0f, -2.5f, 1f, 2.5f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(src0Path, typeof(Transform), "localEulerAnglesRaw.x"), AnimationCurve.Linear(0f, -20f, 1f, 20f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(src0Path, typeof(Transform), "localEulerAnglesRaw.y"), AnimationCurve.Constant(0f, 1f, 0f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(src0Path, typeof(Transform), "localEulerAnglesRaw.z"), AnimationCurve.Constant(0f, 1f, 0f)); RuntimeRiggingEditorTestFixture.TestTransferMotionToConstraint(constraint, rigBuilder, clip, new Transform[] { src0 }, CompareFlags.TR); }
public void BlendConstraint_TransferMotionToSkeleton() { var data = BlendConstraintTests.SetupConstraintRig(); var constraint = data.constraint; var rootGO = data.rigData.rootGO; var rigBuilder = rootGO.GetComponent <RigBuilder>(); var constrainedObject = constraint.data.constrainedObject; var src0 = constraint.data.sourceObjectA; var src1 = constraint.data.sourceObjectB; var clip = new AnimationClip(); var constraintPath = AnimationUtility.CalculateTransformPath(constraint.transform, rootGO.transform); var src0Path = AnimationUtility.CalculateTransformPath(src0, rootGO.transform); var src1Path = AnimationUtility.CalculateTransformPath(src1, rootGO.transform); var positionWeightAttribute = ((IBlendConstraintData)constraint.data).positionWeightFloatProperty; var rotationWeightAttribute = ((IBlendConstraintData)constraint.data).rotationWeightFloatProperty; AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(src0Path, typeof(Transform), "m_LocalPosition.x"), AnimationCurve.Constant(0f, 1f, src0.localPosition.x)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(src0Path, typeof(Transform), "m_LocalPosition.y"), AnimationCurve.Constant(0f, 1f, src0.localPosition.y)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(src0Path, typeof(Transform), "m_LocalPosition.z"), AnimationCurve.Constant(0f, 1f, src0.localPosition.z)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(src1Path, typeof(Transform), "m_LocalPosition.x"), AnimationCurve.Constant(0f, 1f, src1.localPosition.x)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(src1Path, typeof(Transform), "m_LocalPosition.y"), AnimationCurve.Constant(0f, 1f, src1.localPosition.y)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(src1Path, typeof(Transform), "m_LocalPosition.z"), AnimationCurve.Constant(0f, 1f, src1.localPosition.z)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(constraintPath, typeof(BlendConstraint), positionWeightAttribute), AnimationCurve.Linear(0f, 0f, 1f, 1f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(constraintPath, typeof(BlendConstraint), rotationWeightAttribute), AnimationCurve.Linear(0f, 0f, 1f, 1f)); RuntimeRiggingEditorTestFixture.TestTransferMotionToSkeleton(constraint, rigBuilder, clip, new Transform[] { constrainedObject }, CompareFlags.TR); }
public void MultiParentConstraint_TransferMotionToConstraint( [Values(false, true)] bool applySourcePositionOffsets, [Values(false, true)] bool applySourceRotationOffsets, [Values(AxesMask.X, AxesMask.XY, AxesMask.XYZ)] AxesMask constrainedPositionAxesMask, [Values(AxesMask.X, AxesMask.XY, AxesMask.XYZ)] AxesMask constrainedRotationAxesMask) { var data = MultiParentConstraintTests.SetupConstraintRig(); var constraint = data.constraint; var rootGO = data.rigData.rootGO; var rigBuilder = rootGO.GetComponent <RigBuilder>(); var constrainedObject = constraint.data.constrainedObject; var sources = constraint.data.sourceObjects; constraint.data.maintainPositionOffset = applySourcePositionOffsets; constraint.data.maintainRotationOffset = applySourceRotationOffsets; constraint.data.constrainedPositionXAxis = RuntimeRiggingEditorTestFixture.TestXAxis(constrainedPositionAxesMask); constraint.data.constrainedPositionYAxis = RuntimeRiggingEditorTestFixture.TestYAxis(constrainedPositionAxesMask); constraint.data.constrainedPositionZAxis = RuntimeRiggingEditorTestFixture.TestZAxis(constrainedPositionAxesMask); constraint.data.constrainedRotationXAxis = RuntimeRiggingEditorTestFixture.TestXAxis(constrainedRotationAxesMask); constraint.data.constrainedRotationYAxis = RuntimeRiggingEditorTestFixture.TestYAxis(constrainedRotationAxesMask); constraint.data.constrainedRotationZAxis = RuntimeRiggingEditorTestFixture.TestZAxis(constrainedRotationAxesMask); var src0 = sources[0].transform; var src1 = sources[1].transform; src0.transform.position += new Vector3(3f, 6f, 9f); src1.transform.position += new Vector3(9f, 6f, 3f); src0.transform.rotation *= Quaternion.Euler(90f, 60f, 30f); src1.transform.rotation *= Quaternion.Euler(30f, 60f, 90f); var clip = new AnimationClip(); var constraintPath = AnimationUtility.CalculateTransformPath(constraint.transform, rootGO.transform); var constrainedObjectPath = AnimationUtility.CalculateTransformPath(constraint.data.constrainedObject, rootGO.transform); var weight0Attribute = ((IMultiParentConstraintData)constraint.data).sourceObjectsProperty + ".m_Item0.weight"; var weight1Attribute = ((IMultiParentConstraintData)constraint.data).sourceObjectsProperty + ".m_Item1.weight"; AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(constraintPath, typeof(MultiParentConstraint), weight0Attribute), AnimationCurve.Constant(0f, 1f, 0.5f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(constraintPath, typeof(MultiParentConstraint), weight1Attribute), AnimationCurve.Constant(0f, 1f, 0.5f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(constrainedObjectPath, typeof(Transform), "m_LocalPosition.x"), AnimationCurve.Linear(0f, -0.5f, 1f, 0.5f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(constrainedObjectPath, typeof(Transform), "m_LocalPosition.y"), AnimationCurve.Linear(0f, -1.5f, 1f, 1.5f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(constrainedObjectPath, typeof(Transform), "m_LocalPosition.z"), AnimationCurve.Linear(0f, -2.5f, 1f, 2.5f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(constrainedObjectPath, typeof(Transform), "localEulerAnglesRaw.x"), AnimationCurve.Linear(0f, -20f, 1f, 20f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(constrainedObjectPath, typeof(Transform), "localEulerAnglesRaw.y"), AnimationCurve.Constant(0f, 1f, 0f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(constrainedObjectPath, typeof(Transform), "localEulerAnglesRaw.z"), AnimationCurve.Constant(0f, 1f, 0f)); RuntimeRiggingEditorTestFixture.TestTransferMotionToConstraint(constraint, rigBuilder, clip, new Transform[] { constrainedObject }, CompareFlags.TR); }
public void MultiPositionConstraint_TransferMotionToConstraint( [Values(false, true)] bool applySourceOffsets, [Values(false, true)] bool applyDrivenOffset, [Values(AxesMask.X, AxesMask.XY, AxesMask.XYZ)] AxesMask axesMask) { var data = MultiPositionConstraintTests.SetupConstraintRig(); var constraint = data.constraint; var rootGO = data.rigData.rootGO; var rigBuilder = rootGO.GetComponent <RigBuilder>(); var constrainedObject = constraint.data.constrainedObject; var sources = constraint.data.sourceObjects; var vectorMask = new Vector3( System.Convert.ToSingle(RuntimeRiggingEditorTestFixture.TestXAxis(axesMask)), System.Convert.ToSingle(RuntimeRiggingEditorTestFixture.TestYAxis(axesMask)), System.Convert.ToSingle(RuntimeRiggingEditorTestFixture.TestZAxis(axesMask)) ); constraint.data.maintainOffset = applySourceOffsets; constraint.data.offset = applyDrivenOffset ? AnimationRuntimeUtils.Select(Vector3.zero, new Vector3(1f, 2f, 3f), vectorMask) : Vector3.zero; constraint.data.constrainedXAxis = RuntimeRiggingEditorTestFixture.TestXAxis(axesMask); constraint.data.constrainedYAxis = RuntimeRiggingEditorTestFixture.TestYAxis(axesMask); constraint.data.constrainedZAxis = RuntimeRiggingEditorTestFixture.TestZAxis(axesMask); var src0 = sources[0].transform; var src1 = sources[1].transform; src0.transform.position += Vector3.right; src1.transform.position += Vector3.up; var clip = new AnimationClip(); var constraintPath = AnimationUtility.CalculateTransformPath(constraint.transform, rootGO.transform); var constrainedObjectPath = AnimationUtility.CalculateTransformPath(constraint.data.constrainedObject, rootGO.transform); var weight0Attribute = ((IMultiPositionConstraintData)constraint.data).sourceObjectsProperty + ".m_Item0.weight"; var weight1Attribute = ((IMultiPositionConstraintData)constraint.data).sourceObjectsProperty + ".m_Item1.weight"; AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(constraintPath, typeof(MultiPositionConstraint), weight0Attribute), AnimationCurve.Constant(0f, 1f, 0.5f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(constraintPath, typeof(MultiPositionConstraint), weight1Attribute), AnimationCurve.Constant(0f, 1f, 0.5f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(constrainedObjectPath, typeof(Transform), "m_LocalPosition.x"), AnimationCurve.Linear(0f, -0.5f, 1f, 0.5f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(constrainedObjectPath, typeof(Transform), "m_LocalPosition.y"), AnimationCurve.Linear(0f, -1.5f, 1f, 1.5f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(constrainedObjectPath, typeof(Transform), "m_LocalPosition.z"), AnimationCurve.Linear(0f, -2.5f, 1f, 2.5f)); RuntimeRiggingEditorTestFixture.TestTransferMotionToConstraint(constraint, rigBuilder, clip, new Transform[] { constrainedObject }, CompareFlags.TR); }
public void TwoBoneIKConstraint_TransferMotionToConstraint( [Values(false, true)] bool applyTargetPositionOffset, [Values(false, true)] bool applyTargetRotationOffset, [Values(1f)] float targetPositionWeight, [Values(1f)] float targetRotationWeight) { var data = TwoBoneIKConstraintTests.SetupConstraintRig(); var constraint = data.constraint; var rootGO = data.rigData.rootGO; var rigBuilder = rootGO.GetComponent <RigBuilder>(); var tip = constraint.data.tip; var mid = constraint.data.mid; var root = constraint.data.root; var target = constraint.data.target; constraint.data.maintainTargetPositionOffset = applyTargetPositionOffset; constraint.data.maintainTargetRotationOffset = applyTargetRotationOffset; constraint.data.targetPositionWeight = targetPositionWeight; constraint.data.targetRotationWeight = targetRotationWeight; target.position += new Vector3(9f, 6f, 3f); target.rotation *= Quaternion.Euler(90f, 60f, 30f); var clip = new AnimationClip(); var rootPath = AnimationUtility.CalculateTransformPath(root, rootGO.transform); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(rootPath, typeof(Transform), "localEulerAnglesRaw.x"), AnimationCurve.Constant(0f, 1f, 0f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(rootPath, typeof(Transform), "localEulerAnglesRaw.y"), AnimationCurve.Constant(0f, 1f, 0f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(rootPath, typeof(Transform), "localEulerAnglesRaw.z"), AnimationCurve.Linear(0f, 0f, 1f, 20f)); var midPath = AnimationUtility.CalculateTransformPath(mid, rootGO.transform); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(midPath, typeof(Transform), "localEulerAnglesRaw.x"), AnimationCurve.Constant(0f, 1f, 0f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(midPath, typeof(Transform), "localEulerAnglesRaw.y"), AnimationCurve.Constant(0f, 1f, 0f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(midPath, typeof(Transform), "localEulerAnglesRaw.z"), AnimationCurve.Linear(0f, 0f, 1f, 20f)); var tipPath = AnimationUtility.CalculateTransformPath(tip, rootGO.transform); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(tipPath, typeof(Transform), "localEulerAnglesRaw.x"), AnimationCurve.Constant(0f, 1f, 0f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(tipPath, typeof(Transform), "localEulerAnglesRaw.y"), AnimationCurve.Constant(0f, 1f, 0f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(tipPath, typeof(Transform), "localEulerAnglesRaw.z"), AnimationCurve.Linear(0f, 0f, 1f, 20f)); RuntimeRiggingEditorTestFixture.TestTransferMotionToConstraint(constraint, rigBuilder, clip, new Transform[] { tip, mid, root }, CompareFlags.TR); }
public void MultiParentConstraint_TransferMotionToSkeleton() { var data = MultiParentConstraintTests.SetupConstraintRig(); var constraint = data.constraint; var rootGO = data.rigData.rootGO; var rigBuilder = rootGO.GetComponent <RigBuilder>(); var constrainedObject = constraint.data.constrainedObject; var sources = constraint.data.sourceObjects; var clip = new AnimationClip(); var src0 = sources[0].transform; var src1 = sources[1].transform; var constraintPath = AnimationUtility.CalculateTransformPath(constraint.transform, rootGO.transform); var src0Path = AnimationUtility.CalculateTransformPath(src0, rootGO.transform); var src1Path = AnimationUtility.CalculateTransformPath(src1, rootGO.transform); var weight0Attribute = ((IMultiParentConstraintData)constraint.data).sourceObjectsProperty + ".m_Item0.weight"; var weight1Attribute = ((IMultiParentConstraintData)constraint.data).sourceObjectsProperty + ".m_Item1.weight"; AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(src0Path, typeof(Transform), "m_LocalPosition.x"), AnimationCurve.Constant(0f, 1f, src0.localPosition.x)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(src0Path, typeof(Transform), "m_LocalPosition.y"), AnimationCurve.Linear(0f, src0.localPosition.y, 1f, src0.localPosition.y + 0.5f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(src0Path, typeof(Transform), "m_LocalPosition.z"), AnimationCurve.Constant(0f, 1f, src0.localPosition.z)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(src0Path, typeof(Transform), "localEulerAnglesRaw.x"), AnimationCurve.Constant(0f, 1f, 0f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(src0Path, typeof(Transform), "localEulerAnglesRaw.y"), AnimationCurve.Linear(0f, -50f, 1f, 50f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(src0Path, typeof(Transform), "localEulerAnglesRaw.z"), AnimationCurve.Constant(0f, 1f, 0f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(constraintPath, typeof(MultiParentConstraint), weight0Attribute), AnimationCurve.Linear(0f, 0f, 1f, 1f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(src1Path, typeof(Transform), "m_LocalPosition.x"), AnimationCurve.Linear(0f, src1.localPosition.x, 1f, src1.localPosition.x + 0.5f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(src1Path, typeof(Transform), "m_LocalPosition.y"), AnimationCurve.Constant(0f, 1f, src1.localPosition.y)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(src1Path, typeof(Transform), "m_LocalPosition.z"), AnimationCurve.Constant(0f, 1f, src1.localPosition.z)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(src1Path, typeof(Transform), "localEulerAnglesRaw.x"), AnimationCurve.Linear(0f, -50f, 1f, 50f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(src1Path, typeof(Transform), "localEulerAnglesRaw.y"), AnimationCurve.Constant(0f, 1f, 0f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(src1Path, typeof(Transform), "localEulerAnglesRaw.z"), AnimationCurve.Constant(0f, 1f, 0f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(constraintPath, typeof(MultiParentConstraint), weight1Attribute), AnimationCurve.Linear(0f, 1f, 0f, 0f)); RuntimeRiggingEditorTestFixture.TestTransferMotionToSkeleton(constraint, rigBuilder, clip, new Transform[] { constrainedObject }, CompareFlags.TR); }
public void MultiAimConstraint_TransferMotionToConstraint( [Values(false, true)] bool applySourceOffsets, [Values(false, true)] bool applyDrivenOffset) { var data = MultiAimConstraintTests.SetupConstraintRig(); var constraint = data.constraint; var rootGO = data.rigData.rootGO; var rigBuilder = rootGO.GetComponent <RigBuilder>(); var constrainedObject = constraint.data.constrainedObject; var sources = constraint.data.sourceObjects; constraint.data.maintainOffset = applySourceOffsets; constraint.data.offset = applyDrivenOffset ? new Vector3(90f, 1f, 1f) : Vector3.zero; constraint.data.constrainedXAxis = true; constraint.data.constrainedYAxis = true; constraint.data.constrainedZAxis = true; var src0 = sources[0].transform; var src1 = sources[1].transform; src0.transform.position += Vector3.forward; src1.transform.position += Vector3.up; var clip = new AnimationClip(); var constraintPath = AnimationUtility.CalculateTransformPath(constraint.transform, rootGO.transform); var constrainedObjectPath = AnimationUtility.CalculateTransformPath(constraint.data.constrainedObject, rootGO.transform); var weight0Attribute = ((IMultiAimConstraintData)constraint.data).sourceObjectsProperty + ".m_Item0.weight"; var weight1Attribute = ((IMultiAimConstraintData)constraint.data).sourceObjectsProperty + ".m_Item1.weight"; AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(constraintPath, typeof(MultiAimConstraint), weight0Attribute), AnimationCurve.Constant(0f, 1f, 0.5f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(constraintPath, typeof(MultiAimConstraint), weight1Attribute), AnimationCurve.Constant(0f, 1f, 0.5f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(constrainedObjectPath, typeof(Transform), "localEulerAnglesRaw.x"), AnimationCurve.Linear(0f, -20f, 1f, 20f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(constrainedObjectPath, typeof(Transform), "localEulerAnglesRaw.y"), AnimationCurve.Constant(0f, 1f, 0f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(constrainedObjectPath, typeof(Transform), "localEulerAnglesRaw.z"), AnimationCurve.Constant(0f, 1f, 0f)); RuntimeRiggingEditorTestFixture.TestTransferMotionToConstraint(constraint, rigBuilder, clip, new Transform[] { constrainedObject }, CompareFlags.TR); }
public void TwistChainConstraint_TransferMotionToConstraint() { var data = TwistChainConstraintTests.SetupConstraintRig(); var constraint = data.constraint; var rootGO = data.rigData.rootGO; var rigBuilder = rootGO.GetComponent <RigBuilder>(); var tip = constraint.data.tip; var root = constraint.data.root; var clip = new AnimationClip(); // Add keyframes for root and tips. Transform[] chain = ConstraintsUtils.ExtractChain(root, tip); var rootPath = AnimationUtility.CalculateTransformPath(root, rootGO.transform); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(rootPath, typeof(Transform), "localEulerAnglesRaw.x"), AnimationCurve.Constant(0f, 1f, 0f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(rootPath, typeof(Transform), "localEulerAnglesRaw.y"), AnimationCurve.Constant(0f, 1f, 0f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(rootPath, typeof(Transform), "localEulerAnglesRaw.z"), AnimationCurve.Linear(0f, 0f, 1f, -50f)); var tipPath = AnimationUtility.CalculateTransformPath(tip, rootGO.transform); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(tipPath, typeof(Transform), "localEulerAnglesRaw.x"), AnimationCurve.Constant(0f, 1f, 0f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(tipPath, typeof(Transform), "localEulerAnglesRaw.y"), AnimationCurve.Constant(0f, 1f, 0f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(tipPath, typeof(Transform), "localEulerAnglesRaw.z"), AnimationCurve.Linear(0f, 0f, 1f, 50f)); // Also keyframe inbetween keys for (int i = 1; i < chain.Length - 1; ++i) { var path = AnimationUtility.CalculateTransformPath(chain[i], rootGO.transform); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(path, typeof(Transform), "localEulerAnglesRaw.x"), AnimationCurve.Constant(0f, 1f, 0f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(path, typeof(Transform), "localEulerAnglesRaw.y"), AnimationCurve.Constant(0f, 1f, 0f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(path, typeof(Transform), "localEulerAnglesRaw.z"), AnimationCurve.Constant(0f, 1f, 0f)); } RuntimeRiggingEditorTestFixture.TestTransferMotionToConstraint(constraint, rigBuilder, clip, new Transform[] { root, tip }, CompareFlags.Rotation); }
public void TwoBoneIKConstraint_TransferMotionToSkeleton() { var data = TwoBoneIKConstraintTests.SetupConstraintRig(); var constraint = data.constraint; var rootGO = data.rigData.rootGO; var rigBuilder = rootGO.GetComponent <RigBuilder>(); var tip = constraint.data.tip; var mid = constraint.data.mid; var root = constraint.data.root; var target = constraint.data.target; var clip = new AnimationClip(); var targetPath = AnimationUtility.CalculateTransformPath(target, rootGO.transform); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(targetPath, typeof(Transform), "m_LocalPosition.x"), AnimationCurve.Constant(0f, 1f, target.localPosition.x)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(targetPath, typeof(Transform), "m_LocalPosition.y"), AnimationCurve.Linear(0f, target.localPosition.y, 1f, target.localPosition.y + 0.5f)); AnimationUtility.SetEditorCurve(clip, EditorCurveBinding.FloatCurve(targetPath, typeof(Transform), "m_LocalPosition.z"), AnimationCurve.Constant(0f, 1f, target.localPosition.z)); RuntimeRiggingEditorTestFixture.TestTransferMotionToSkeleton(constraint, rigBuilder, clip, new Transform[] { tip, mid, root }, CompareFlags.TR); }