Alembic的设计哲学
这篇文档是写给那些想理解Alembic设计初衷和设计哲学的开发者,这样就能明白库中
的东西为什么是按照现在的样子组织的。此文档不是maya或者prman插件的最终用户指南。
Alembic旨在促进烘焙(cached)几何体的工作流以及跨平台的几何体交换共享。
其内核是一个高效存储有层级关系(hierarchical)的类型化(typed)数据样
本(sample)的库,以此达到了上面的目的。
这上面的系统将数据插值为几何体或者几何变换,但是要时刻将其内部的数据管理放在首要地位。此文档
的目标就是让读者明白Alembic的核心概念,以及如何用他们来创建几何表示。
Section 1: 库的层级
Alembic由好几个层库组成,大体上每一层都基于下一层而建立的。从最底层到上面的具体实现,依次是:
Alembic::AbcCoreAbstract(命名空间简称:AbcA)
AbcCoreAbstract库几乎是纯虚层,其定义了Alembic必须实现的存储层接口(eg,AbcCoreHDF5)。此层定义了某些概念的接口,比如
Objects,Properties,字节数据(byte_size)。更多有关Alembic概念的东西,如Object,Property在section 2中讲. 这层几乎有所的参数
和返回类型都是boost::shared_ptrs,其名字中会有"Ptr"前缀来体现。Boost的共享指针提供了不需大量手工就可以管理资源的强力方法。
从内存管理角度,这让Alembic库更加易用和统一。
此层中Alembic的一个重要部分就是时间的概念,其形式为TimeSampling,TimeSamplingType类。其不是纯虚类并提供了丰富的接口处理数
据样本的临时组件。这个层中仅有的几个类直接暴露在上面的层中。
AbcCoreAbstract没打算成为Alembic中初级人性化的数据操作库。那个荣誉属于Abc库。
Alembic::Abc(命名空间简称:Abc)
Abc库,就像上面提到的,是Alembic中人性化的数据操作库,并提供了来自AbcCoreAbstract层中共享指针的对象化封装。同时,和
AbcCoreAbstract相比,Abc层重新解释了其操作的数据,AbcCoreAbstract层中1024字节的连续数据块,在Abc层被认为是Imatch::M44d的
一个实例。
Alembic::AbcGeom(命名空间简称:AbcGeom)
AbcGeom层建立在Abc层之上,打算成为以几何意义(PolyMesh,Xforms等)解释数据处理的基本层。虽然Alembic被分成了多层,但是所
有低级命名空间都被提升到了其上面的空间。因此,当用户代码“ using namespace AbcGeom;”所有来自AbcA或者Abc的标示符,可以
直接使用。关于读写数据的建议
因为Alembic是一个缓存系统,不是活的场景图,API被大致分成对称的两类:一类写,一类读。在Abc,AbcGeom层有前缀“O”的类是输出
类,有前缀“I”的是输入类。这和C++的iostream分成istreams和ostreams的概念很像。