当前位置: 首页 > web >正文

[3D数据存储] Archive (File Container) | 创建/写入/读取 | 存储格式HDF5

链接:https://www.alembic.io/

在这里插入图片描述

docs:Alembic

Alembic是一种强大的开放交换格式和库,用于高效存储和交换复杂3D场景数据

它允许艺术家和工作室以稳健无损的方式在不同3D软件应用之间**归档和传输动画几何体、相机及材质**。

概览

在这里插入图片描述

章节

  1. 归档(文件容器)
  2. 对象(场景节点)
  3. 属性(数据容器)
  4. 时间采样(动画时间轴)
  5. 几何体模式(3D数据类型)
  6. 材质模式(着色器定义)
  7. 分层归档(文件叠加)

第一章:归档(文件容器)

欢迎进入Alembic的精彩世界~

在这开篇章节中,我们将从Alembic存储3D数据的基础——归档(常称为文件容器)开始探索。

什么是归档?为什么需要它?

想象我们正在创建复杂3D场景,可能包含:

  • 角色模型
  • 角色动画(行走、跳跃)
  • 背景环境(树木、山脉)
  • 场景照明
  • 捕捉动作的相机

传统方式保存这些元素意味着需要多个文件,或依赖特定软件专属格式。这使得协作共享变得困难。

Alembic通过将所有3D场景相关元素打包至单一自包含文件解决此问题,该文件即称为"归档"(或文件容器)

可将Alembic归档视作特殊.zip文件,但专为3D图形数据设计。

它不仅压缩文档,更以高度结构化方式高效存储3D模型、动画、相机等元素。

本章目标是掌握Alembic归档基础操作:打开现有归档读取数据创建新归档写入数据

读取归档数据(IArchive

当需要处理现有Alembic文件(如my_scene.abc)时,需"打开"它。Alembic中使用IArchive(“I"代表"输入"或"读取”)。

由于Alembic文件可能采用不同底层格式(如HDF5或Ogawa,目前无需深究),Alembic提供名为IFactory的智能工具识别文件格式。IFactory如同智能"钥匙串",尝试不同密钥直至找到正确方式打开文件。

以下是C++中使用IFactory打开Alembic文件的示例:

#include <Alembic/AbcCoreFactory/All.h> // 用于IFactory
#include <Alembic/Abc/All.h>           // 用于IArchive// ... 函数内部 ...Alembic::AbcCoreFactory::IFactory factory; // 智能钥匙串
Alembic::AbcCoreFactory::IFactory::CoreType coreType; // 识别文件类型// 尝试打开"input_scene.abc"
Alembic::Abc::IArchive archive = factory.getArchive("input_scene.abc", coreType);// 验证归档是否成功打开
if (!archive.valid()) 
{// 错误处理:文件无法打开printf("错误:指定的Alembic文件无效!\n");return 1; // 返回失败状态
}// 执行至此,'archive'已代表打开的Alembic文件~

factory.getArchive

若"input_scene.abc"有效,archive变量将成为有效IArchive对象,作为访问文件内3D数据的入口。

写入归档数据(OArchive

创建新Alembic文件并保存3D场景时,使用OArchive(“O"代表"输出"或"写入”)。

创建OArchive时需指定存储格式,主流选项为HDF5Ogawa,初学者任选其一即可,选择通常取决于性能需求。

以下是使用HDF5格式创建"output_scene.abc"的示例:

#include <Alembic/AbcCoreHDF5/All.h> // 用于HDF5写入
#include <Alembic/Abc/All.h>         // 用于OArchive// ... 函数内部 ...// 创建名为"output_scene.abc"的新Alembic文件
// 使用Alembic::AbcCoreHDF5::WriteArchive()指定HDF5格式Alembic::Abc::OArchive outArchive = Alembic::Abc::OArchive(Alembic::AbcCoreHDF5::WriteArchive(), // 指定使用HDF5"output_scene.abc",                   // 新文件名Alembic::Abc::MetaData(),             // 可选:当前为空元数据Alembic::Abc::ErrorHandler::kThrowPolicy // 错误处理策略
);// 执行至此,'outArchive'已代表新建的空Alembic文件~

此代码将创建"output_scene.abc"文件,初始为空,outArchive对象已准备好接收3D场景元素。

数据存储格式

HDF5
一种通用的文件格式,用于存储和管理大规模科学数据,支持分层组织和高效压缩,广泛应用于科研和工程领域。

Ogawa
Alembic(一种3D图形数据交换格式)的专用存储格式,针对动画和特效数据的快速读写进行了优化,结构简单且轻量。

底层原理:归档工作机制

简析打开/创建Alembic归档时的内部过程。

打开归档(IArchive

IFactory打开Alembic文件的过程:

在这里插入图片描述

  1. 用户请求:告知IFactory要打开的文件名
  2. 文件检查IFactory读取文件头确定内部结构(如HDF5、Ogawa)
  3. 阅读器创建:根据文件类型创建对应阅读器(如AbcCoreOgawa::ReadArchive
  4. IArchive就绪:返回IArchive对象供访问数据

Alembic工具AbcConvert演示此过程,可见factory.getArchive调用:

// 摘自:bin/AbcConvert/AbcConvert.cpp
// ...
Alembic::AbcCoreFactory::IFactory factory;
Alembic::AbcCoreFactory::IFactory::CoreType coreType;// 单个输入文件时直接获取归档
if(options.inFiles.size() == 1)
{archive = factory.getArchive(*options.inFiles.begin(), coreType);// ... 错误处理 ...
}
// ...

factory.getArchive尝试打开文件并识别coreTypearchive变量即成为IArchive实例。

IArchive类定义于lib/Alembic/Abc/IArchive.h,其构造函数接收ARCHIVE_CTOR(由IFactory在识别文件类型后提供):

// 摘自:lib/Alembic/Abc/IArchive.h
// ...
template <class ARCHIVE_CTOR>
IArchive::IArchive( ARCHIVE_CTOR iCtor, // 特定阅读器(HDF5、Ogawa)const std::string &iFileName,ErrorHandler::Policy iPolicy,AbcA::ReadArraySampleCachePtr iCachePtr )
{// ...m_archive = iCtor( iFileName, iCachePtr ); // 实际打开文件// ...
}
// ...

创建归档(OArchive

创建新Alembic文件过程更直接,因需明确指定格式:

在这里插入图片描述

  1. 用户请求:指定文件名和存储格式(如Alembic::AbcCoreHDF5::WriteArchive()
  2. 容器初始化OArchive在磁盘创建空文件并写入格式头信息
  3. OArchive就绪:返回OArchive对象作为新文件句柄

AbcConvert.cpp示例展示如何显式创建OArchive

// 摘自:bin/AbcConvert/AbcConvert.cpp
// ...
Alembic::Abc::OArchive outArchive;
if (options.toType == IFactoryNS::kHDF5)
{outArchive = Alembic::Abc::OArchive(Alembic::AbcCoreHDF5::WriteArchive(), // 指定HDF5写入器options.outFile,                      // 输出文件名inTop.getMetaData(),                  // 元数据(从输入复制)Alembic::Abc::ErrorHandler::kThrowPolicy);
}
// ...

此处直接使用Alembic::AbcCoreHDF5::WriteArchive()作为ARCHIVE_CTOR创建HDF5格式输出归档。

OArchive类定义于lib/Alembic/Abc/OArchive.h,其构造函数模式相同:

// 摘自:lib/Alembic/Abc/OArchive.h
// ...
template <class ARCHIVE_CTOR>
OArchive::OArchive( ARCHIVE_CTOR iCtor, // 特定写入器(HDF5、Ogawa)const std::string &iFileName,const Argument &iArg0,const Argument &iArg1 )
{// ...m_archive = iCtor( iFileName, args.getMetaData() ); // 实际创建文件// ...
}
// ...

总结

本章学习到**Alembic归档**是3D场景数据的核心容器,如同专用压缩文件。

  • 使用IArchive**读取**现有Alembic文件,常借助IFactory自动检测文件格式
  • 使用OArchive**写入**新Alembic文件,明确选择存储格式(如HDF5或Ogawa)

IArchiveOArchive是操作这些强大数据容器的主要接口。但容器内具体结构如何?这正是下一章要探索的内容!

第二章:对象(场景节点)

http://www.xdnf.cn/news/17125.html

相关文章:

  • RocketMQ与Kafka 消费者组的‌重平衡操作消息顺序性对比
  • 低空三维多物理场耦合风洞试验,保证飞行器的性能安全是低空飞行的底线,是低空经济发展的基础
  • Ethereum: 深度解析Web3世界的合规之门, ERC-1400证券型代币标准
  • Apache Camel 中 ProducerTemplate
  • Hadoop HDFS 3.3.4 讲解~
  • C++信息学奥赛一本通-第一部分-基础一-第一章
  • 微信小程序本地存储与Cookie的区别
  • 架构进阶——解读45页企业架构管理方法与需求受理流程【附全文阅读】
  • AI绘图-Stable Diffusion-WebUI的基本用法
  • Node.js(四)之数据库与身份认证
  • 更智能的 RibbonBar Spread.NET 18.2Crack
  • [spring-cloud: @LoadBalanced @LoadBalancerClient]-源码分析
  • 【Linux | 网络】网络层(IP协议、NAT技术和ICMP协议)
  • SpringBoot整合t-io是websocket实时通信
  • LeetCode 分类刷题:16. 最接近的三数之和
  • 《汇编语言:基于X86处理器》第11章 复习题和练习
  • uiautomator2 编写测试流程-登陆后的酷狗01
  • 进程生命周期管理:从创建到终止的完整逻辑
  • 探索医学领域多模态人工智能的发展图景:技术挑战与临床应用的范围综述|文献速递-医学影像算法文献分享
  • iOS 内测上架流程详解:跨平台团队如何快速部署 TestFlight
  • 注解知识学习
  • 凹槽类零部件尺寸的检测方法有哪些 - 激光频率梳 3D 轮廓检测
  • [硬件电路-156]:什么是电信号? 电信号的本质:电信号是随时间变化的电压或电流。本质是电子运动表征信息,兼具能量传输与信息编码传递功能。
  • Mac电脑基本功能快捷键
  • EdgeView for macOS:解决图像管理痛点的利器
  • 设计模式 -> 策略模式(Strategy Pattern)
  • 经典设计模式
  • 验证码等待时间技术在酒店自助入住、美容自助与社区场景中的应用必要性研究—仙盟创梦IDE
  • Calcite自定义扩展SQL案例详细流程篇
  • 六、Linux核心服务与包管理