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 unInt32Array
).
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 :
selfBounds
childBounds
(en option)GeomParams
(en option)UserProperties
(en option)
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 :
- D’un
TimeSamplingType
(Uniforme, cyclique, ou acyclique) - D’un tableau de valeurs de temps (
std::vector<chrono_t>
).
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