Référence sur les extensions de fichiers Alembic dans 3ds Max

3ds Max enrichit la spécification des fichiers Alembic pour permettre le stockage de données supplémentaires et améliorer les échanges de données avec d'autres applications. Ces extensions se basent sur les normes Autodesk pour améliorer l'interopérabilité avec les autres produits Autodesk (Maya, par exemple). Cette rubrique décrit les normes Autodesk et répertorie les extensions spécifiques générées par 3ds Max pour les exportations de fichiers Alembic.

Remarques générales

  • Les noms de noeuds et de propriétés ne contiennent pas d'espaces.
  • Les attributs personnalisés sont enregistrés dans une propriété .userProperties. Ils peuvent se trouver sous les noeuds .geom ou .xform, ce qui permet de définir des données personnalisées pour des objets sans géométrie.

Canaux UV supplémentaires

  • Des canaux UV supplémentaires sont stockés sous .arbGeomParams, dans la propriété .geom.
  • Le nom de la propriété correspond au nom du canal.
  • Seules les données UV sont exportées (pas les données UVW).
  • .vals est un réseau de kFloat32POD où Etendue = 2.
  • .indices est un réseau de kUint32POD où Etendue = 1.

Données non exportées

Les splines ne sont pas prises en charge dans Alembic. Les splines sont converties en NURBS pour l'exportation.

Instances

Les instances sont prises en charge lorsqu'elles respectent la spécification Alembic. Toutefois, les géométries répétées ne sont pas détectées et sont converties en instances lors de l'importation.

Caméras

Les caméras de scène 3ds Max sont exportées dans Alembic.

Maya exporte par défaut les caméras en perspective (vue de face, de perspective, de côté et de dessus).

Noeuds de données personnalisés 3ds Max

Noeuds 3ds Max
Noeud Type Remarques
Node/Node/MaxVisibility Scalaire : Float32

Conteneur des attributs d'objet 3ds Max. Les attributs pris en charge sont les suivants :

{ 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 Objet composé

Conteneur des attributs personnalisés affectés à l'objet de base. Tous les types d'attributs personnalisés sont pris en charge directement, sauf les noeuds, les texmaps et les matériaux. En effet, leur nom de référence est enregistré sous la forme d'une chaîne et de réseaux, donc seul l'index de l'élément sélectionné est enregistré.

Métadonnées : "max_a_uihint" est associé à chaque attribut pour indiquer comment les données sont utilisées (énumérations ParamType et ParamType2).

Node/Node/MaxCustomAttributes_Modifier Objet composé Conteneur des attributs personnalisés affectés au modificateur des objets. Identique à la description ci-dessus. REMARQUE : non pris en charge actuellement lors de l'importation.

Nouveautés de la version 1.0.0
Noeud Type Commentaires
Node/Node/.userProperties/Max_CustomAttributes_BaseObject
Node/Node/.userProperties/Max_CustomAttributes_Modifier
Node/Node/.userProperties/Max_CustomAttributes_Modifier OStringProperty Indique le nom de la couche contenant ce noeud.
Node/Node/.geom/.arbGeomParams/Max_Map_Channel "Name" Objet composé Conteneur d'un canal.
Node/Node/.geom/.arbGeomParams/Max_Map_Channel "Name"/.vals Réseau d'OV2fGeomParam ou d'OV3fGeomParam Contient les données de texture.
Node/Node/.geom/.arbGeomParams/Max_Map_Channel "Name"/.indices Réseau d'OInt32Property Contient les indices de texture.
Node/Node/.geom/.arbGeomParams/Max_Map_Channel "Name"/Max_Map_ChannelNumber Oint32property scalaire Canal texture utilisé par 3ds max.
Node/Node/.geom/.arbGeomParams/Max_Vertex_Color_Map Objet composé Conteneur pour le canal de couleur de sommet.
Node/Node/.geom/.arbGeomParams/Max_Vertex_Color_Map/.vals Réseau d'OC3fGeomParam Contient les données de couleur de sommet.
Node/Node/.geom/.arbGeomParams/Max_Vertex_Color_Map/.indices Réseau d'OInt32Property Indices de couleur de sommet.
Node/Node/.geom/.userProperties/Max_MaterialName OStringProperty Contient le nom du matériau du noeud.
Node/Node/.geom/.userProperties/Max_ObjectID OUInt32Property Contient l'ID d'objet du noeud.
Node/Node/.geom/Max_MaterialID_# Objet composé Contient le schéma du jeu de faces 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 Propriété supplémentaire de l'ID de matériau de la face.

Propriétés des courbes prises en charge

Noeud Type Commentaires
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

Propriétés de caméra prises en charge

Les propriétés de caméra prises en charge et la façon dont elles sont spécifiées dans 3dsMax sont décrites ci-dessous.

       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 );

Propriétés de subdivision prises en charge

Non prises en charge.

Propriétés de primitives de points prises en charge

Les particules simples et PFlow sont prises par OPointsSchema.