Python、Alembic.io、Cask:使用 write_to_file() 时不保存对象的属性

Python, Alembic.io, Cask: Properties of object do not save when using write_to_file()

我经常为各种 3d 包(3ds max、Maya 等)编写脚本,这就是为什么我对 Alembic 感兴趣,这是一种最近受到广泛关注的文件格式。

对不了解此项目的人的快速解释:alembic - www.alembic.io - 是一种文件格式,用于包含 3d 网格和与之相关的数据。它使用树状结构,如下所示,具有一个根节点及其子节点、子节点的子节点等。该节点的对象可以具有属性。

我正在尝试学习如何将此 Alembic 与 Python 一起使用。

这个项目的停靠页面上有一些教程,我遇到了一些问题: http://docs.alembic.io/python/cask.html 它是关于使用 cask 模块——一个应该更容易操作文件内容的包装器。

这部分:

a = cask.Archive("animatedcube.abc")
r = cask.Xform()
x = a.top.children["cube1"]
a.top.children["root"] = r
r.children["cube1"] = x
a.write_to_file("/var/tmp/cask_insert_node.abc")

效果很好。之后有新文件 "cask_insert_node.abc" 并且它具有预期的对象。

但是当我向对象添加一些属性时,如下所示:

a = cask.Archive("animatedcube.abc")
r = cask.Xform()
x = a.top.children["cube1"]
x.properties['new_property'] = cask.Property()
a.top.children["root"] = r
r.children["cube1"] = x
a.write_to_file("/var/tmp/cask_insert_node.abc")

结果文件中的 "cube1" 对象不包含 属性 "new_property"。 保存过程是个问题,我知道 属性 在保存之前已添加到 "cube1",我用另一种方式检查了它,使用我编写的函数在存档中创建对象图。

此模块的代码在那里: source

有谁知道我做错了什么?如何保存参数?其他方式?

遗憾的是,cask 不支持这个。不能修改存档并保存结果(某种程度上与 Alembic 如何从磁盘流式传输数据有关)。您要做的是创建一个输出存档

oArchive = alembic.Abc.CreateArchiveWithInfo(...)

然后将所有需要的数据从输入存档复制到输出存档,包括时间采样(

.addTimeSampling(iArchive.getTimeSampling(i) for i in iArchive.getNumTimeSamplings()

和对象,通过 iArchive.getTop() 和 oArchive.getTop() 递归定义输出属性(alembic.Abc.OArrayProperty,或 OScalarProperty),因为您在 iArchive 中遇到它们。定义这些后,您可以在那时将新值作为样本插入 属性。

它是一头真正的野兽,是 cask 真正应该支持的东西。事实上,Alembic 社区的某个人应该帮每个人一个忙,写一个 cask2(棺材?),它将所有这些包装成简单的调用,就像你本能地尝试做的那样。