Maya には、アニメーション カーブのエクスポートと編集用のファイル フォーマットが用意されています。このファイル フォーマットは、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;