Ejemplo n.º 1
0
        //
        //    Description:
        //        Converts the tangent angles from Maya 2.* to Maya3.0+ formats.
        //
        protected void convertAnglesAndWeights2To3(MFnAnimCurve.AnimCurveType type,
            bool isWeighted, ref MAngle angle, ref double weight)
        {
            double oldAngle = angle.asRadians;

            double newAngle = oldAngle;
            double newWeight = weight;

            //	Calculate the scale values for the conversion.
            //
            double xScale = 1.0;
            double yScale = 1.0;

            MTime tOne = new MTime(1.0, MTime.Unit.kSeconds);
            if (type == MFnAnimCurve.AnimCurveType.kAnimCurveTT ||
                type == MFnAnimCurve.AnimCurveType.kAnimCurveTL ||
                type == MFnAnimCurve.AnimCurveType.kAnimCurveTA ||
                type == MFnAnimCurve.AnimCurveType.kAnimCurveTU) {

                xScale = tOne.asUnits(MTime.uiUnit);
            }

            switch (type)
            {
                case MFnAnimCurve.AnimCurveType.kAnimCurveTT:
                case MFnAnimCurve.AnimCurveType.kAnimCurveUT:
                    yScale = tOne.asUnits(MTime.uiUnit);
                    break;
                case MFnAnimCurve.AnimCurveType.kAnimCurveTL:
                case MFnAnimCurve.AnimCurveType.kAnimCurveUL:
                    {
                        MDistance dOne = new MDistance(1.0, MDistance.internalUnit);
                        yScale = dOne.asUnits(linearUnit);
                    }
                    break;
                case MFnAnimCurve.AnimCurveType.kAnimCurveTA:
                case MFnAnimCurve.AnimCurveType.kAnimCurveUA:
                    {
                        MAngle aOne = new MAngle(1.0, MAngle.internalUnit);
                        yScale = aOne.asUnits(angularUnit);
                    }
                    break;
                case MFnAnimCurve.AnimCurveType.kAnimCurveTU:
                case MFnAnimCurve.AnimCurveType.kAnimCurveUU:
                default:
                    break;
            }

            const double quarter = Math.PI/2;
            if (isEquivalent(oldAngle, 0.0) ||
                isEquivalent(oldAngle, quarter) ||
                isEquivalent(oldAngle, -quarter)) {

                newAngle = oldAngle;

                if (isWeighted) {
                    newWeight = yScale*oldAngle;
                }
            } else {
                double tanAngle = Math.Tan(oldAngle);
                newAngle = Math.Atan((yScale*tanAngle)/xScale);

                if (isWeighted) {
                    double cosAngle = Math.Cos(oldAngle);
                    double cosSq = cosAngle*cosAngle;

                    double wSq = (weight*weight) *
                            (((xScale*xScale - yScale*yScale)*cosSq) + (yScale*yScale));

                    newWeight = Math.Sqrt(wSq);
                }
            }

            weight = newWeight;

            MAngle finalAngle = new MAngle(newAngle, MAngle.Unit.kRadians);
            angle = finalAngle;
        }
Ejemplo n.º 2
0
        //
        //    Description:
        //        Converts the tangent angles from Maya 3.0 to Maya2.* formats.
        //
        protected void convertAnglesAndWeights3To2(MFnAnimCurve.AnimCurveType type,
            bool isWeighted, ref MAngle angle, ref double weight)
        {
            double oldAngle = angle.asRadians;
            double newAngle = oldAngle;

            //	Calculate the scale values for the conversion.
            //
            double xScale = 1.0;
            double yScale = 1.0;

            MTime tOne = new MTime(1.0, MTime.Unit.kSeconds);
            if (type == MFnAnimCurve.AnimCurveType.kAnimCurveTT ||
                type == MFnAnimCurve.AnimCurveType.kAnimCurveTL ||
                type == MFnAnimCurve.AnimCurveType.kAnimCurveTA ||
                type == MFnAnimCurve.AnimCurveType.kAnimCurveTU) {

                xScale = tOne.asUnits(MTime.uiUnit);
            }

            switch (type)
            {
                case MFnAnimCurve.AnimCurveType.kAnimCurveTT:
                case MFnAnimCurve.AnimCurveType.kAnimCurveUT:
                    yScale = tOne.asUnits(MTime.uiUnit);
                    break;
                case MFnAnimCurve.AnimCurveType.kAnimCurveTL:
                case MFnAnimCurve.AnimCurveType.kAnimCurveUL:
                    {
                        MDistance dOne = new MDistance(1.0, MDistance.internalUnit);
                        yScale = dOne.asUnits(linearUnit);
                    }
                    break;
                case MFnAnimCurve.AnimCurveType.kAnimCurveTA:
                case MFnAnimCurve.AnimCurveType.kAnimCurveUA:
                    {
                        MAngle aOne = new MAngle(1.0, MAngle.internalUnit);
                        yScale = aOne.asUnits(angularUnit);
                    }
                    break;
                case MFnAnimCurve.AnimCurveType.kAnimCurveTU:
                case MFnAnimCurve.AnimCurveType.kAnimCurveUU:
                default:
                    break;
            }

            double tanAngle = Math.Tan(oldAngle);
            newAngle = Math.Atan((xScale*tanAngle)/yScale);

            if (isWeighted)
            {
                double sinAngle = Math.Sin(oldAngle);
                double cosAngle = Math.Cos(oldAngle);

                double denominator = (yScale*yScale*sinAngle*sinAngle) +
                                        (xScale*xScale*cosAngle*cosAngle);
                weight = Math.Sqrt(weight/denominator);
            }

            MAngle finalAngle = new MAngle(newAngle, MAngle.Unit.kRadians);
            angle = finalAngle;
        }
Ejemplo n.º 3
0
        //    Description:
        //        Write out the anim curve from the clipboard item into the
        //        stream. The actual anim curve data is written out.
        //
        //        This method returns true if the write was successful.
        //
        protected void writeAnimCurve(ref StreamWriter clip, 
            MObject animCurveObj,
            MFnAnimCurve.AnimCurveType type,
            bool verboseUnits = false)
        {
            if (clip == null)
            {
                throw new ArgumentNullException( "clip" );
            }

            if (null == animCurveObj || animCurveObj.isNull)
            {
                throw new ArgumentNullException( "animCurveObj" );
            }

            MFnAnimCurve animCurve = new MFnAnimCurve(animCurveObj);

            clip.Write(kAnimData + kSpaceChar + kBraceLeftChar + Environment.NewLine);

            clip.Write(kTwoSpace + kInputString + kSpaceChar +
                    boolInputTypeAsWord(animCurve.isUnitlessInput) +
                    kSemiColonChar + Environment.NewLine);

            clip.Write( kTwoSpace + kOutputString + kSpaceChar +
                    outputTypeAsWord(type) + kSemiColonChar + Environment.NewLine);

            clip.Write(kTwoSpace + kWeightedString + kSpaceChar +
                    Convert.ToString(animCurve.isWeighted ? 1 : 0) + kSemiColonChar +Environment.NewLine);

            //	These units default to the units in the header of the file.
            //
            if (verboseUnits)
            {
                clip.Write(kTwoSpace + kInputUnitString + kSpaceChar);
                if (animCurve.isTimeInput)
                {
                    string unitName = "";
                    animUnitNames.setToShortName(timeUnit, ref unitName);
                    clip.Write(unitName);
                }
                else
                {
                    //	The anim curve has unitless input.
                    //
                    clip.Write(animUnitNames.kUnitlessString);
                }

                clip.Write(kSemiColonChar + Environment.NewLine);

                clip.Write(kTwoSpace + kOutputUnitString + kSpaceChar);
            }

            double conversion = 1.0;
            switch (type)
            {
                case MFnAnimCurve.AnimCurveType.kAnimCurveTA:
                case MFnAnimCurve.AnimCurveType.kAnimCurveUA:
                    {
                        string unitName = "";
                        animUnitNames.setToShortName(angularUnit, ref unitName);
                        if (verboseUnits) clip.Write(unitName);
                        {
                            MAngle angle = new MAngle(1.0);
                            conversion = angle.asUnits(angularUnit);
                        }
                        break;
                    }
                case MFnAnimCurve.AnimCurveType.kAnimCurveTL:
                case MFnAnimCurve.AnimCurveType.kAnimCurveUL:
                    {
                        string unitName = "";
                        animUnitNames.setToShortName(linearUnit, ref unitName);
                        if (verboseUnits) clip.Write(unitName);
                        {
                            MDistance distance = new MDistance(1.0);
                            conversion = distance.asUnits(linearUnit);
                        }
                        break;
                    }
                case MFnAnimCurve.AnimCurveType.kAnimCurveTT:
                case MFnAnimCurve.AnimCurveType.kAnimCurveUT:
                    {
                        string unitName = "";
                        animUnitNames.setToShortName(timeUnit, ref unitName);
                        if (verboseUnits) clip.Write(unitName);
                        break;
                    }
                default:
                    if (verboseUnits) clip.Write(animUnitNames.kUnitlessString);
                    break;
            }

            if (verboseUnits) clip.Write(kSemiColonChar +Environment.NewLine);

            if (verboseUnits)
            {
                string angleUnitName = "";
                animUnitNames.setToShortName(angularUnit, ref angleUnitName);
                clip.Write(kTwoSpace + kTanAngleUnitString +
                        kSpaceChar + angleUnitName + kSemiColonChar + Environment.NewLine);
            }

            clip.Write(kTwoSpace + kPreInfinityString + kSpaceChar +
                    infinityTypeAsWord(animCurve.preInfinityType) +
                    kSemiColonChar + Environment.NewLine);

            clip.Write(kTwoSpace + kPostInfinityString + kSpaceChar +
                    infinityTypeAsWord(animCurve.postInfinityType) +
                    kSemiColonChar + Environment.NewLine);

            clip.Write(kTwoSpace + kKeysString + kSpaceChar + kBraceLeftChar + Environment.NewLine);

            // And then write out each keyframe
            //
            uint numKeys = animCurve.numKeyframes;
            for (uint i = 0; i < numKeys; i++)
            {
                clip.Write(kTwoSpace + kTwoSpace);
                if (animCurve.isUnitlessInput)
                {
                    clip.Write(animCurve.unitlessInput(i));
                }
                else
                {
                    clip.Write(animCurve.time(i).value);
                }

                // clamp tiny values so that it isn't so small it can't be read in
                //
                double animValue = (conversion*animCurve.value(i));
                if (isEquivalent(animValue,0.0))
                    animValue = 0.0;
                clip.Write(kSpaceChar + Convert.ToString(animValue));

                clip.Write(kSpaceChar + tangentTypeAsWord(animCurve.inTangentType(i)) );
                clip.Write(kSpaceChar + tangentTypeAsWord(animCurve.outTangentType(i)) );

                clip.Write( kSpaceChar + Convert.ToString(animCurve.tangentsLocked(i) ? 1 : 0));
                clip.Write(kSpaceChar + Convert.ToString(animCurve.weightsLocked(i) ? 1 : 0));
                clip.Write(kSpaceChar + Convert.ToString(animCurve.isBreakdown(i) ? 1 : 0));

                if (animCurve.inTangentType(i) == MFnAnimCurve.TangentType.kTangentFixed)
                {
                    MAngle angle = new MAngle();
                    double weight = 0.0;
                    animCurve.getTangent(i, angle, ref weight, true);

                    clip.Write(kSpaceChar + Convert.ToString(angle.asUnits(angularUnit)));
                    clip.Write(kSpaceChar + Convert.ToString(weight));
                }
                if (animCurve.outTangentType(i) == MFnAnimCurve.TangentType.kTangentFixed)
                {
                    MAngle angle = new MAngle();
                    double weight = 0.0;
                    animCurve.getTangent(i, angle, ref weight, false);

                    clip.Write(kSpaceChar +  Convert.ToString(angle.asUnits(angularUnit)));
                    clip.Write(kSpaceChar + Convert.ToString(weight));
                }

                clip.Write(kSemiColonChar + Environment.NewLine);
            }
            clip.Write(kTwoSpace + kBraceRightChar + Environment.NewLine);

            clip.Write(kBraceRightChar + Environment.NewLine);
        }