Notes concernant Alembic

Code

Aperçu des quelques classes récurrentes.

IPolyMesh

Un IPolyMesh est un typedef sur Abc::ISchemaObject<IPolyMeshSchema>.

ISchemaObject

Un ISchemaObject est une classe dérivée de IObject. Elle est définie dans Abc/ISchemaObject.h. Lien ici.

Traduction de la documentation :

Un ISchemaObject est un objet avec un unique schéma. Il s’agit simplement d’une classe de commodité, mais elle s’occupe également de la configuration et de la validation des métadonnées.

Un IObject étant un objet pouvant être stocké physiquement dans un IArchive, je soupçonne que le ISchemaObject ne sert qu’à stocker un Schema.

IPolyMeshSchema, IGeomBaseSchema et ISchema

IPolyMeshSchema hérite de IGeomBaseSchema qui lui-même hérite de ISchema.

L’explication d’un Shema est donné dans Abc/OSchema.h. Lien ici.

Traduction de la documentation :

Un Schema est un ensemble de propriétés groupées qui implémentent des objects plus complexes, tel qu’un poly mesh. Dans le cas le plus simple, il y a, tout en haut, une propriété composée avec un nom donné, et à l’intérieur de cette propriété composée, il y a des propriétés additionnelles implémentant l’objet. Dans le cas d’un poly mesh, ces propriétés seraient une list de vertices (V3fArray), une liste d’indices (Int32Array), et une liste de « nombre de points par face » (également dans un Int32Array).

IGeomBaseSchema (défini dans AbcGeom/IGeomBase.h, lien ici) est une classe contenant les propriétés communes à toutes les classes géométriques ayant un volume physique :

Cette classe est utilisée pour encapsuler les fonctionnalités communes des classes schema de géométrie ; IPoints, IPolyMesh, etc.

TimeSampling

Un TimeSampling fait la relation entre l’index d’un sample et sa valeur de temps (souvent en seconde). Lien ici.

Traduction de la documentation :

La classe TimeSampling sert à récupérer les valeurs de temps associées aux samples d’une propriété. Généralement, le sampling sera uniforme ou cyclique, dès lors il s’agit d’une interface algorithmique sur le petit tampon de temps samplé. Dans le cas d’un sampling acyclique, cette classe fait office d’accesseur au tableau de temps.

Cette classe est composée :

ArrayProperty

Les IInt32ArrayProperty, IP3fArrayProperty, et autre *ArrayProperty sont des ITypedArrayProperty définies dans Abc/ITypedArrayProperty.h. Lien ici.

Convertir un CameraSample en matrice de projection

Voici un code PyAlembic pour convertir un CameraSample en matrice de projection :

near = cam_sample.getNearClippingPlane()
far = cam_sample.getFarClippingPlane()
fov = cam_sample.getFieldOfView()

width = 1920.0
heigth = 1080.0

ratio = width / float(height)

focal_length = 1.0 / math.tan((fov / 2.0) * (math.pi / 180.0))

mtx = [[focal_length, 0.0, 0.0, 0.0],
       [0.0, focal_length * ratio, 0.0, 0.0],
       [0.0, 0.0, (far + near) / (far - near), -1.0],
       [0.0, 0.0, (2.0 * far * near) / (far - near), 0.0]]

On pourrait utiliser getHorizontalAperture() et getVerticalAperture() pour générer le ratio, mais en pratique, ce paramètre est rarement correctement défini dans vos Alembics.

Le code précédent a été testé comparativement à la caméra originale, dans Maya :

import maya.OpenMaya as om

selection_list = om.MSelectionList()
dag_camera = om.MDagPath()

selection_list.add('perspShape')
selection_list.getDagPath(0, dag_camera)

_mfn_camera = om.MFnCamera(dag_camera)
cam_proj_mtx = _mfn_camera.projectionMatrix()

v = [[cam_proj_mtx(i, j) for j in range(4)]
      for i in range(4)]
print v

Dernière mise à jour : mar. 06 juillet 2021