Page MenuHome

Alembic design notes
Open, NormalPublic



  • ABC = Alembic file (because extension is .abc)
  • DNA = Blender’s data structure

Current Functionality

Importing meshes from ABC can result in multiple cases. For each imported object:

  • No object animation, no mesh deformation: mesh is imported into DNA as regular mesh object, after that no more link with ABC.
  • With object animation: as above, but with constraint that streams transformations from ABC to DNA.
  • With mesh deformation: as first case, but with modifier that streams mesh data from ABC to DNA, possibly even removing and reconstructing the entire mesh.

Other functionality:

  • Materials are buggy (materials should be mapped by name, but we don’t seem to save those to ABC).
  • Curves are supported and loaded as Blender curves (but miss certain properties such as extrustion, etc.).
  • Particles in ABC are loaded as vertex-only mesh.
  • Camera animation is partially supported (transforms, but not camera properties such as zoom/DoF)

Currently easy to do:

  • Static mesh exchange between other software and Blender (because of point 1 above)
  • Adding constraints/modifiers on top of ABC import.
  • Removing extraneous objects.
  • Assigning and editing materials (but on data level may be troublesome).
  • Adding hair/particle systems (it may not work well, but it’s easy to add).

Currently hard or impossible to do:

  • Keeping Blender in sync with ABC (automatically importing added objects, etc.)
  • Knowing (from user perspective) which objects are from ABC and which are from Blender.
  • Performing actions for all imported objects (such as setting a consistent time offset)
  • Offsetting objects in space.
  • Flipping between “real” objects and cached versions.
  • Reliably add hair/particle system, groom, and bake to ABC again.

Tech meeting with Sybren, Sergey, and Campbell

Features discussed:

  • Data streaming can be implemented in same way as dupli-lists / dupli-groups:
    • Loaded ABC is represented as dupli-object. This allows us to generate the meshes / curves from ABC without saving them to the blend file. It also allows the artist to spatially offset the ABC.
    • Dupli-object has option to indicate which sub-hierarchy is loaded. This allows artists to select a subset of objects in the ABC, for example loading an animated character but not the environment or cameras.
    • Dupli-object is stored as DNAAlembicHierarchy struct in DNA.
    • Objects from ABC are shown in outliner as collection, similar as currently done with dupli-group.
    • Besides being able to disable the entire collection (currently possible), it should be possible to disable individual objects (not yet possible). This allows, for example, to load an animated Agent 327 from ABC and remove/hide his watch.
    • The collection could contain options to indicate which sub-hierarchy it represents, and a time offset for animations.
    • Alembic XForm hierarchies are loaded as hierarchy of Empties, possibly as their own subgraph in the depsgraph.
    • Open question: how to interact with the objects, how to create static overrides or otherwise “make local”.
  • Material names are loaded from ABC
    • Currently Blender doesn’t even properly store material names to ABC at all.
    • The creator of the ABC is responsible for assigning materials to objects / data. The name of these materials should be saved to the ABC.
    • When loading an ABC the materials are looked up by name (if there are duplicates from different libraries, pick arbitrary one).
    • An artist should be able to choose which material names in the ABC map to which Blender materials.
    • It might be nice to have a button “Generate Missing Materials”, which automatically creates correctly-named materials and assigns them to the meshes/objects.
  • Objects loaded from ABC should be handled as “linked from library”, with the ABC as “virtual library”. Interaction between objects from ABC and Blender should be discussed (for example when merging two meshes, one from ABC and one from Blender).
  • Hair: It may be possible to load an animated mesh from ABC, add a hair system, groom it, and save to another ABC. This poses problems with ABC allowing meshes to arbitrarily change topology (and thus also vertex and face order) from one frame to the next. Possible solutions lie in reconnecting the hair system after loading the ABC (for example by using UV coordinates instead of vertex/face indices) or disallowing mesh changes completely after adding hair (this option won’t be liked by artists). We should check with artists in the industry to see which workflows are actually in use.
  • Motion blur: object motion blur is already there. Deformation motion blur should work when the mesh doesn’t change topology. Otherwise it can work if we save & load velocities.

Interface Mockup

Future Work

Possible directions that we may implement in the future, and may be nice to know about in advance to at least not make completely impossible with current design choices. The basic idea behind this feature is fixups on top of cached data.

Sculpt on top of ABC mesh

Here Hjalti takes the role of the animator, and Andy that of the shader/lighter/look developer.

  1. Hjalti animates character, exports to ABC.
  2. Andy loads ABC, tweaks materials and environment.
  3. Andy locally changes the ABC-streamed mesh (e.g. not changing topology, but for a number of frames change, say, the position of the hand).
  4. Andy saves those changes to another ABC file that acts as a 2nd layer of mesh data.

Steps 2-4 can be repeated, generating multiple layers of ABC files that eventually are all merged into a single animated character in Blender (this merging of data from different ABC files is supported by ABC itself).

Open Questions

  • How to interact with instanced objects from ABC.
  • How to allow modifiers to be stacked on top of imported ABC meshes/curves.

Development Targets

TBD which is part of Code Quest, or postponed to later. Should be discussed with artists for final decision on what to build & how.

  1. Rework ABC importer to produce DNAAlembicHierarchy structs instead of directly creating new objects/meshes/curves/cameras.
  2. Allow enable/disable of individual objects in ABC dupli-group.
  3. Create & link Collection for ABC.
  4. Fix material name saving.
  5. Create system for material linking.
  6. Implement switching collection between ‘cached’ and ‘live’.
  7. User Interaction between ABC-backed and non-ABC-backed objects (for example trying to join two of those, or trying to parent a Blender object to an ABC object or vice versa)
  8. Make the hair system work.
  9. Test motion blur to clarify what works and what doesn’t (and implement/fix the latter if desired).