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的概念很像。