private void SetRotCurveData(RotationCurve rotCurve, AnimationCurve curve, string propertyName)
        {
            int cnt = curve.keys.Length;

            Keyframe[] srcKeys = curve.keys;

            if (rotCurve.keys == null)
            {
                rotCurve.keys = new RotationKeyFrame[cnt];
            }

            rotCurve.preWrapMode  = curve.preWrapMode;
            rotCurve.postWrapMode = curve.postWrapMode;
            //rotCurve.rotationOrder  = RotationOrder.Default;

            if (propertyName.EndsWith(".x"))
            {
                for (int i = 0; i < cnt; i++)
                {
                    Keyframe keyFrame = srcKeys[i];
                    rotCurve.keys[i].time       = keyFrame.time;
                    rotCurve.keys[i].value.x    = keyFrame.value;
                    rotCurve.keys[i].inSlope.x  = keyFrame.inTangent;
                    rotCurve.keys[i].outSlope.x = keyFrame.outTangent;
                }
            }
            else if (propertyName.EndsWith(".y"))
            {
                for (int i = 0; i < cnt; i++)
                {
                    Keyframe keyFrame = srcKeys[i];
                    rotCurve.keys[i].time       = keyFrame.time;
                    rotCurve.keys[i].value.y    = keyFrame.value;
                    rotCurve.keys[i].inSlope.y  = keyFrame.inTangent;
                    rotCurve.keys[i].outSlope.y = keyFrame.outTangent;
                }
            }
            else if (propertyName.EndsWith(".z"))
            {
                for (int i = 0; i < cnt; i++)
                {
                    Keyframe keyFrame = srcKeys[i];
                    rotCurve.keys[i].time       = keyFrame.time;
                    rotCurve.keys[i].value.z    = keyFrame.value;
                    rotCurve.keys[i].inSlope.z  = keyFrame.inTangent;
                    rotCurve.keys[i].outSlope.z = keyFrame.outTangent;
                }
            }
            else if (propertyName.EndsWith(".w"))
            {
                for (int i = 0; i < cnt; i++)
                {
                    Keyframe keyFrame = srcKeys[i];
                    rotCurve.keys[i].time       = keyFrame.time;
                    rotCurve.keys[i].value.w    = keyFrame.value;
                    rotCurve.keys[i].inSlope.w  = keyFrame.inTangent;
                    rotCurve.keys[i].outSlope.w = keyFrame.outTangent;
                }
            }
        }
        private void ProcessClip()
        {
            EditorCurveBinding[] bindings = AnimationUtility.GetCurveBindings(_clip);
            foreach (var binding in bindings)
            {
                AnimationCurve curve = AnimationUtility.GetEditorCurve(_clip, binding);
                ProcessCurve(curve, binding);
            }

            // 某些 Curve 只有两个关键帧并且值是相同的,去掉此类 Curve 的第二个关键帧以节省空间
            foreach (ClipCurveData data in _curveDic.Values)
            {
                RotationCurve rotCurve = data.rotationCurve;
                if (rotCurve.keys.Length == 2 && rotCurve.keys[0] == rotCurve.keys[1])
                {
                    rotCurve.keys = new RotationKeyFrame[1] {
                        rotCurve.keys[0]
                    }
                }
                ;

                Vector3Curve posCurve = data.positionCurve;
                if (posCurve.keys.Length == 2 && posCurve.keys[0] == posCurve.keys[1])
                {
                    posCurve.keys = new Vector3KeyFrame[1] {
                        posCurve.keys[0]
                    }
                }
                ;

                Vector3Curve scaleCurve = data.scaleCurve;
                if (scaleCurve.keys.Length == 2 && scaleCurve.keys[0] == scaleCurve.keys[1])
                {
                    if (scaleCurve.keys[0].value == Vector3.one) // 这种情况就不要记录曲线了
                    {
                        data.scaleCurve = null;
                    }
                    else
                    {
                        scaleCurve.keys = new Vector3KeyFrame[1] {
                            scaleCurve.keys[0]
                        }
                    };
                }
            }
        }
Exemple #3
0
 private double CalculateRotation(double intervalPos)
 {
     return(ScaleCurveToValue(RotationCurve.GetValue(intervalPos), 150, -150));
 }