通过动画文件格式,可以导出和编辑动画曲线。文件格式以这种形式进行定义:外部应用程序可以轻松读取和写入,而无需使用 Maya API。
Anim File Format // A description of the anim file format. // August 16, 1998 // // The .anim file format (version 1.0): // // and # are both valid comment characters. // // All of the lines in the file that do not contain curly braces // (’{’ or ’}’) should end with a ’;’ After the ’;’ character, start // a new line. // // The keywords and data are whitespace delimited. // // Version 1.1 changes: // April 20, 1999 // new weighted keyword for animData // new breakdown flag for keys // // The version of the file format. This is a required line. // animVersion string // The Maya version. The string is the value of MGlobal::mayaVersion() mayaVersion string // The following two lines are optional. If they are not included, // the clipboard is set to the range defined by the anim curves // contained in the clipboard. // // These are used by anim curves that have time inputs. // startTime [float] // The starting frame for the clipboard. endTime [float] // The ending frame for the clipboard. // The following two lines are optional. If they are not included, // the clipboard is set to the range defined by the anim curves // contained in the clipboard. // // These are used by anim curves with unitless inputs. // startUnitless [float] // The starting value for for the clipboard. endUnitless [float] // The ending value for the clipboard. // The following three keywords are used to set the units for the file. // Each anim curve may have its own units, but these are the default // units if the anim curve units are not given (see the animData section). // // If the units are not given, then the ui units are used. // timeUnit [game|film|pal|ntsc|show|palf|ntscf|hour|min|sec|millisec] linearUnit [mm|cm|m|km|in|ft|yd|mi] angularUnit [rad|deg|min|sec] // All of the keywords described above can only be in the header section // of the file. As soon as anim curve information is encountered, the // header section is completed and the body of the file is begun. // // The string is the name of the attribute the anim curve is connected to. // The next three ints are the row, child, and attr values used by the // clipboard. See the documentation for MAnimCurveClipboard for more // information. // // If the anim curve is not connected to any attributes, the string // is not needed, but the following ints should be 0 0 0. anim [string] [int] [int] [int] // The second form of the anim line has three strings which list what // the anim curve was connected to. // // The strings are: the full attribute name, the leaf attribute name, // and the node name. The row, child, and attr ints are still required. // anim [string] [string] [string] [int] [int] [int] // The third and final form of the anim line is used for clipboard // place holder objects. These are used to skip node which do not // contain any anim curve data, but are positioned in a hierarchy // with nodes that have attached anim curves. // // In this case, the string is the node name and the three ints are the // same as the other two formats. // anim [string] [int] [int] [int] // The animData must follow a line with a valid anim statement. // animData { // The input type of the anim curve. Defaults to time. input [time|unitless] // The output type of the anim curve. Defaults to linear. output [time|linear|angular|unitless] // Whether or not the anim curve has weighted tangents. Defaults to false. // This is available with animVersion >= 1.1 weighted [1|0] // The unit of the anim curve input, if it is a time input. // The units default to the time units specified in the file header. inputUnit [game|film|pal|ntsc|show|palf|ntscf|hour|min|sec|millisec] // The unit of the anim curve output. The output unit should match // the output type of the curve. These default to the units specified // in the header. outputUnit [game|film|pal|ntsc|show|palf|ntscf|hour|min|sec|millisec] outputUnit [mm|cm|m|km|in|ft|yd|mi] outputUnit [rad|deg|min|sec] // The unit of the tangent angles, if there are any fixed tangents. // The units default to the angular units specified in the file header. tangentAngleUnit [rad|deg|min|sec] // The pre-infinity type. Defaults to constant. preInfinity [constant|linear|cycle|cycleRelative|oscillate] // The post-infinity type. Defaults to constant. postInfinity [constant|linear|cycle|cycleRelative|oscillate] // The start of the actual keyframe data. Each key is a row in the // braced section. keys { [float] [float] [in tan] [out tan] [tan locked] [weight locked] // animVersion 1.1 adds breakdown information [float] [float] [in tan] [out tan] [tan locked] [weight locked] [breakdown] . . . // The first two values are the input and output values in the // units defined by the inputUnit and outputUnit keywords. // The in and out tangents should be valid tangent types. // These are followed by three int values for tangent locking, // weight locking and the breakdown flag. If they are 0, the values // are unlocked, or not a breakdown, otherwise they are locked. // // If either, or both, or the tangents are fixed, then additional // information is needed: a tangent angle and weight. // These two values, per fixed tangent, are added at the end of // the above line. // // For example: // 1.0 2.0 fixed linear 1 1 0 62.345 0.04; // // In the above case, 62.345 is the tangent angle for the first // tangent and the tangent weight is 0.04. // // An example with two fixed tangents: // 1.0 2.0 fixed fixed 1 1 0 62.345 0.04 45.3 0.023; } } The pattern of an anim line followed by animData should be used until all of the anim curves are described. The following example is an animated joint chain consisting of 4 joints. The first three joints are animated and the fourth joint is not animated. animVersion 1.1; mayaVersion 2.0; timeUnit ntsc; linearUnit cm; angularUnit deg; startTime 1; endTime 30; anim rotate.rotateX rotateX joint1 0 1 0; animData { input time; output angular; weighted 0; preInfinity constant; postInfinity constant; keys { 1 0 linear linear 1 1 0; 30 0 linear linear 1 1 0; } } anim rotate.rotateY rotateY joint1 0 1 1; animData { input time; output angular; weighted 0; preInfinity constant; postInfinity constant; keys { 1 0 linear linear 1 1 0; 30 0 linear linear 1 1 0; } } anim rotate.rotateZ rotateZ joint1 0 1 2; animData { input time; output angular; weighted 0; preInfinity constant; postInfinity constant; keys { 1 0 spline spline 1 1 0; 10 -16.774359 spline spline 1 1 0; 15 -1.6493069 spline spline 1 1 0; 22 -3.064691 spline spline 1 1 0; 30 0 spline spline 1 1 0; } } anim rotate.rotateX rotateX joint2 1 1 0; animData { input time; output angular; weighted 0; preInfinity constant; postInfinity constant; keys { 1 0 linear linear 1 1 0; 30 0 linear linear 1 1 0; } } anim rotate.rotateZ rotateZ joint2 1 1 1; animData { input time; output angular; weighted 0; preInfinity constant; postInfinity constant; keys { 1 0 spline spline 1 1 0; 10 60.962438 spline spline 1 1 0; 15 106.06094 spline spline 1 1 0; 22 33.259896 spline spline 1 1 0; 30 0 spline spline 1 1 0; } } anim rotate.rotateX rotateX joint3 2 1 0; animData { input time; output angular; weighted 0; preInfinity constant; postInfinity constant; keys { 1 0 spline spline 1 1 0; 10 0 spline spline 1 1 0; 15 0 spline spline 1 1 0; 22 0 spline spline 1 1 0; 30 0 spline spline 1 1 0; } } anim rotate.rotateY rotateY joint3 2 1 1; animData { input time; output angular; weighted 0; preInfinity constant; postInfinity constant; keys { 1 0 spline spline 1 1 0; 10 0 spline spline 1 1 0; 15 0 spline spline 1 1 0; 22 0 spline spline 1 1 0; 30 0 spline spline 1 1 0; } } anim rotate.rotateZ rotateZ joint3 2 1 2; animData { input time; output angular; weighted 0; preInfinity constant; postInfinity constant; keys { 1 0 spline spline 1 1 0; 10 0 spline spline 1 1 0; 15 0 spline spline 1 1 0; 22 0 spline spline 1 1 0; 30 0 spline spline 1 1 0; } } anim joint4 3 0 0;