3ds Max Alembic File Extension Reference

3ds Max augments the Alembic file specification to store extra data and enable better data exchange with other applications. These extensions follow Autodesk standards, to enhance interop with other Autodesk products (such as Maya). This topic describes the Autodesk standards, and lists the specific extensions 3ds Max populates for Alembic file exports.

General Notes

  • Nodes and properties do not have spaces in their names.
  • Custom Attributes are stored under a .userProperties property. These can be under either .geom or .xform nodes, to allow objects without geometry to have custom data.

Additional UV Channels

  • Extra UV channels are stored under .arbGeomParams, under the .geom property.
  • The property name is the channel name.
  • Only UV data is exported, not UVW.
  • .vals is an array of kFloat32POD with Extent = 2
  • .indices is an array of kUint32POD with Extent = 1

Unexported Data

Splines are not supported in Alembic. Splines are converted to NURBs for export.

Instances

Instances are supported when they follow the Alembic specification. However, repeated geometry is not detected and converted into instances on import.

Cameras

3ds Max scene cameras are exported in Alembic.

Maya exports perspective cameras (front, perspective, side, and top) by default.

3ds Max Custom Data Nodes

Max Nodes
Node Type Notes
Node/Node/MaxVisibility Scalar : Float32

Container to hold Max Object Attributes. Supported attributes are:

{ kHide, _T("Hide"), CustomAttribute::DataType::kBool},

{ kFreeze, _T("Freeze"), CustomAttribute::DataType::kBool},

{ kSeeThrough, _T("SeeThrough"), CustomAttribute::DataType::kBool},

{ kDisplayAsBox,_T("DisplayAsBox"), CustomAttribute::DataType::kBool },

{ kBackfaceCull,_T("BackfaceCull"), CustomAttribute::DataType::kBool },

{ kEdgesOnly,_T("EdgesOnly"), CustomAttribute::DataType::kBool},

{ kVertexTicks,_T("VertexTicks"), CustomAttribute::DataType::kBool},

 kMotionPaths,_T("MotionPaths"), CustomAttribute::DataType::kBool},

{ kIgnoreExtents,_T("IgnoreExtents"), CustomAttribute::DataType::kBool},

{ kShowFrozenInGray,_T("ShowFrozenInGray"), CustomAttribute::DataType::kBool},

{ kNeverDegrade,_T("NeverDegrade"), CustomAttribute::DataType::kBool},

{ kRenderable,_T("Renderable"), CustomAttribute::DataType::kBool},

{ kInheritVisibility,_T("InheritVisibility"), CustomAttribute::DataType::kBool },

{ kVisibleToCamera,_T("VisibleToCamera"), CustomAttribute::DataType::kBool},

{ kVisibleToReflection,_T("VisibleToReflection"), CustomAttribute::DataType::kBool },

{ kReceiveShadows,_T("ReceiveShadows"), CustomAttribute::DataType::kBool},

{ kCastShadows,_T("CastShadows"), CustomAttribute::DataType::kBool},

{ kApplyAtmospherics,_T("ApplyAtmospherics"), CustomAttribute::DataType::kBool},

{ kRenderOccludedObjects,_T("RenderOccludedObjects"), CustomAttribute::DataType::kBool },

{ kDisplayByLayer,_T("DisplayByLayer"), CustomAttribute::DataType::kBool },

{ kRenderingByLayer,_T("RenderingByLayer"), CustomAttribute::DataType::kBool },

{ kMotionBlurByLayer,_T("MotionBlurByLayer"), CustomAttribute::DataType::kBool },

{ kMotionBlurEnabled,_T("MotionBlurEnabled"), CustomAttribute::DataType::kBool},

{ kMotionBlurMultiplier,_T("MotionBlurMultiplier"), CustomAttribute::DataType::kFloat},

{ kMotionBlurType,_T("MotionBlurType"), CustomAttribute::DataType::kInt },

{ kObjectID,_T("ObjectID"), CustomAttribute::DataType::kULong },

{ kUserPropBuffer,_T("UserPropBuffer"), CustomAttribute::DataType::kString },
Node/Node/MaxCustomAttributes_BaseObject Compound

Container to hold Custom Attributes assigned to the base object. Note all CA types are supported directly except Nodes, Texmaps, Material which the refs name is stored as a string and arrays which only stores the selected element index.

MetaData : "max_a_uihint" is attached to each attribute to give a hint as to how the data is used which are the ParamType and ParamType2 enums.

Node/Node/MaxCustomAttributes_Modifier Compound Container to hold Custom Attributes assigned to the objects modifier. Same as above. NOTE not currently supported on import.

New in 1.0.0
Node Type Comments
Node/Node/.userProperties/Max_CustomAttributes_BaseObject
Node/Node/.userProperties/Max_CustomAttributes_Modifier
Node/Node/.userProperties/Max_CustomAttributes_Modifier OStringProperty Contains the name of the layer that contains this Node
Node/Node/.geom/.arbGeomParams/Max_Map_Channel "Name" Compound Container that holds an individual channel
Node/Node/.geom/.arbGeomParams/Max_Map_Channel "Name"/.vals Array of OV2fGeomParam or OV3fGeomParam Contains the texture data
Node/Node/.geom/.arbGeomParams/Max_Map_Channel "Name"/.indices Array of OInt32Property Contains the texture indices
Node/Node/.geom/.arbGeomParams/Max_Map_Channel "Name"/Max_Map_ChannelNumber Scalar OInt32Property The map channel used by Max
Node/Node/.geom/.arbGeomParams/Max_Vertex_Color_Map Compound Container for the vertex color channel
Node/Node/.geom/.arbGeomParams/Max_Vertex_Color_Map/.vals Array of OC3fGeomParam Contains the vertex color data
Node/Node/.geom/.arbGeomParams/Max_Vertex_Color_Map/.indices Array of OInt32Property The vertex color indices
Node/Node/.geom/.userProperties/Max_MaterialName OStringProperty Contains the name of the material of the Node
Node/Node/.geom/.userProperties/Max_ObjectID OUInt32Property Contains the object ID of the Node
Node/Node/.geom/Max_MaterialID_# Compound Contains the faceset schema OFaceSetSchema
Node/Node/.geom/Max_MaterialID_#/.faceset
Node/Node/.geom/Max_MaterialID_#/.faceset/.selfBnds
Node/Node/.geom/Max_MaterialID_#/.faceset/.faces
Node/Node/.geom/Max_MaterialID_#/Max_MaterialID OInt32Property Extra property for the face material ID

Supported curves properties

Node Type Comments
BezierName/BezierName:#
BezierName/BezierName:#/.geom/
BezierName/BezierName:#/.geom/.selfBnds
BezierName/BezierName:#/.geom/.P
BezierName/BezierName:#/.geom/nVertices
BezierName/BezierName:#/.geom/curveBasisAndType
BezierName/BezierName:#/.geom/width
BezierName/BezierName:#/MaxLayerName
BezierName/BezierName:#/\MaxObjectID
Node/NURBSName
Node/NURBSName/.geom/
Node/NURBSName/.geom/.selfBnds
Node/NURBSName/.geom/.P
Node/NURBSName/.geom/nVertices
Node/NURBSName/.geom/curveBasisAndType
Node/NURBSName/.geom/width
Node/NURBSName/MaxLayerName
Node/NURBSName/\MaxObjectID

Supported camera properties

Below are the camera properties supported and how they are computed in Max

       CameraState lCameraState;

       Interval lValid( TIME_NegInfinity, TIME_PosInfinity );
       RefResult lRefResult;

       lRefResult = lGenCamera->EvalCameraState( t, lValid, &lCameraState );
       Interface *lMaxInterface = GetCOREInterface();

       double lLensSqueeenzeRatio = lMaxInterface ? lMaxInterface->GetRendApect() : 1.0;
       mSample.setLensSqueezeRatio( lLensSqueeenzeRatio );

       double lApertureWidth = 3.6f;
       double lApertureHeight = 2.4f;
       if ( lMaxInterface ) {
             lApertureWidth = lMaxInterface->GetRendApertureWidth() * MATH_MM_TO_CM;
             float lImageAspect = lMaxInterface->GetRendImageAspect();
             if ( lImageAspect <= 0.0f ) {
                    lImageAspect = 0.001f;
             }

             lApertureHeight = lApertureWidth * ( 1.0 / lImageAspect );
       }
       mSample.setHorizontalAperture( lApertureWidth );
       mSample.setVerticalAperture( lApertureHeight );      

       double lAngleOfView = lCameraState.fov * MATH_RAD_TO_DEG;
       int lFovType = lGenCamera->GetFOVType();
       double lFocalLength = CalculateFocalLength( lAngleOfView, lApertureWidth,
             lApertureHeight, lFovType, lLensSqueeenzeRatio ) * ( 1.0 / MATH_MM_TO_CM );
       mSample.setFocalLength( lFocalLength );
      

       mSample.setNearClippingPlane( lCameraState.nearRange );
       mSample.setFarClippingPlane( lCameraState.farRange );
       mSample.setFStop( lGenCamera->GetDOFFStop( t ) );
       mSample.setFocusDistance( lCameraState.tdist );

Supported SubDiv properties

Not supported.

Supported Points Primitive properties

Simple and PFlow Particles are supported through the OPointsSchema.