Project Icon

draco

Google开源的3D几何数据压缩库

Draco是Google开发的开源库,用于压缩3D几何网格和点云数据。它可以显著减小3D图形文件大小,同时保持视觉质量。Draco提供C++压缩源码和多语言解码器,支持压缩顶点、连接信息、UV、颜色、法线等属性。通过使用Draco,3D应用可以获得更快的加载速度和更好的渲染性能。

draco-ci

新闻

GStatic用户请注意:Draco团队强烈建议使用带版本号的URL来访问Draco GStatic内容。如果您使用的URL中包含"v1/decoders"子字符串,当新的Draco版本发布时,边缘缓存和GStatic传播延迟可能会导致难以诊断的临时错误。为避免这个问题,请将您的网站固定到特定版本。

1.5.7版本发布:

  • 继续推荐使用带版本号的www.gstatic.com WASM和Javascript解码器。要使用v1.5.7,请使用以下URL:
  • 为Emscripten编码器API添加了对规范化属性的支持。
  • 修复了一些bug。
  • 进行了安全性修复。

1.5.6版本发布:

  • 继续推荐使用带版本号的www.gstatic.com WASM和Javascript解码器。要使用v1.5.6,请使用以下URL:
  • CMake标志DRACO_DEBUG_MSVC_WARNINGS已被DRACO_DEBUG_COMPILER_WARNINGS取代,且行为有所变化。现在它是一个在draco_options.cmake中定义的布尔标志。
  • 修复了一些bug。
  • 进行了安全性修复。

1.5.5版本发布:

1.5.4版本发布:

  • 继续推荐使用带版本号的www.gstatic.com WASM和Javascript解码器。要使用v1.5.4,请使用以下URL:
  • 为glTF扩展EXT_mesh_features和EXT_structural_metadata添加了部分支持。
  • 修复了一些bug。
  • 进行了安全性修复。

1.5.3版本发布:

1.5.2版本发布

  • 这个版本与v1.5.1相同,但修复了以下两个bug:
    • 修复了启用DRACO_TRANSCODER_SUPPORTED的构建。
    • 更新了ABI版本。

1.5.1版本发布

  • 在发布中添加了启用断言的Emscripten构建,并将部分启用断言的构建添加到GStatic。详见下方文件列表。
  • 现在支持第三方依赖的自定义路径。更多信息请参阅BUILDING.md。
  • CMake配置文件draco-config.cmake现已经过测试,已知可在Linux、MacOS和Windows的CMake项目中使用Draco。更多信息请参阅src/draco/tools目录下的install_test子目录。
  • 修复了一些bug。

1.5.0版本发布

  • 添加了draco_transcoder工具。有关glTF转码工具的更多信息,以及构建和依赖信息,请参阅下面的章节和BUILDING.md。
  • 本次发布对配置变量进行了一些更改:
    • DRACO_GLTF标志已重命名为DRACO_GLTF_BITSTREAM,以帮助更好地理解其目的,即将Draco功能限制在Draco glTF规范中包含的功能。
    • 通过draco-config.cmake和find-draco.cmake(原FindDraco.cmake)在CMake中导出的变量已重命名。这不太可能影响任何现有项目,因为上述文件之前的格式并不正确。有关更改的完整详情,请参阅PR775
  • 添加了CMake版本文件。
  • CMake安装目标现在使用CMake直接提供的绝对路径,而不是使用CMAKE_INSTALL_PREFIX构建路径。这是为了使下游打包者更容易使用Draco,对从源代码获取Draco的用户应该影响很小或没有影响。
  • 通过编译器标志更改了某些MSVC警告的级别,以减少MSVC编译器输出的噪音。将MSVC警告级别设置为4,或在CMake配置时定义DRACO_DEBUG_MSVC_WARNINGS,可以恢复之前的行为。
  • 修复了一些bug。

1.4.3版本发布

1.4.1版本发布

1.4.0 版本发布

  • WASM 和 JavaScript 解码器现已托管在静态 URL 上。
  • 将 npm 模块更改为使用 WASM,性能提升约 200%。
  • 将 Emscripten 更新至 2.0 版本。
    • 这导致 Draco 编解码器模块现在返回 promise 而不是直接返回模块。
    • 请参阅示例代码了解如何处理 promise。
  • 将 NORMAL 量化默认值更改为 8。
  • 为解码器添加了新的数组 API,并弃用了 DecoderBuffer。
  • 更改了 WASM/JavaScript 捕获异常的行为。
  • 代码清理。
  • Emscripten 构建现在禁用 NODEJS_CATCH_EXIT 和 NODEJS_CATCH_REJECTION。
    • CLI 工具的作者可能需要添加自己的错误处理程序。
  • 添加了 Maya 插件构建。
  • 更新了 Unity 插件构建。
  • 修复了一些 bug。

1.3.6 版本发布

  • WASM 和 JavaScript 解码器现在托管在静态 URL 上
  • 更改了 Web 示例以从静态 URL 获取 Draco 解码器
  • 为 Draco WASM 解码器添加了新的 API,性能提升约 15%
  • Draco WASM 解码器大小减少约 20%
  • 为 Draco Unity 插件添加了对通用和多个属性的支持
  • 为 Draco Unity 添加了新的 API,解码器性能提升约 15%
  • 更改了量化默认值:
    • 位置:11
    • 法线:7
    • 纹理坐标:10
    • 颜色:8
    • 通用:8
  • 代码清理
  • 修复了一些 bug

1.3.5 版本发布

  • 添加了为通用场景描述构建 Draco 的选项
  • 代码清理
  • 修复了一些 bug

1.3.4 版本发布

  • 发布了 Draco 动画代码
  • 修复了 Unity 相关问题
  • 对各种文件位置和名称进行了更改

1.3.3 版本发布

  • 在 Javascript API 中添加了 ExpertEncoder
    • 允许开发人员为每个属性 ID 设置量化选项
  • 修复了一些 bug

1.3.2 版本发布

  • 修复了一些 bug

1.3.1 版本发布

  • 修复了在跳过属性转换时出现的多个属性问题

1.3.0 版本发布

  • 改进了基于 kD 树的点云编码
    • 现在适用于具有任意数量属性的点云
    • 支持所有整数属性类型和量化浮点类型
  • 网格压缩改进高达 10%(平均约 2%)
    • 对于网格,1.3.0 位流与 1.2.x 解码器完全兼容
  • 改进了 Javascript API
    • 添加了对所有有符号和无符号整数类型的支持
    • 在 Javascript 编码器 API 中添加了对点云的支持
  • 为 PLY 解码器添加了对整数属性的支持
  • 修复了一些 bug

以前的版本

https://github.com/google/draco/releases

描述

Draco 是一个用于压缩和解压缩 3D 几何网格点云的库。它旨在改善 3D 图形的存储和传输。

Draco 的设计和构建注重压缩效率和速度。该代码支持压缩点、连接信息、纹理坐标、颜色信息、法线以及与几何相关的任何其他通用属性。使用 Draco,使用 3D 图形的应用程序可以显著缩小,而不会影响视觉保真度。对于用户来说,这意味着应用程序现在可以更快地下载,浏览器中的 3D 图形可以更快地加载,VR 和 AR 场景现在可以用更少的带宽传输并快速渲染。

Draco 以 C++ 源代码的形式发布,可用于压缩 3D 图形,同时还提供用于编码数据的 C++ 和 Javascript 解码器。

目录

构建

有关构建说明,请参阅 BUILDING

使用

Unity

有关在 Unity 中使用 Draco 的最佳信息,请访问 https://github.com/atteneder/DracoUnity

有关在 Unity 中使用 Draco 的简单示例,请参阅 unity 文件夹中的 README

WASM 和 JavaScript 解码器

建议始终从以下地址获取 Draco WASM 和 JavaScript 解码器:

https://www.gstatic.com/draco/v1/decoders/

随着越来越多的网站开始使用静态 URL,用户将受益于在缓存中保存 Draco 解码器。

命令行应用程序

从构建文件创建的默认目标将是 draco_encoderdraco_decoder 命令行应用程序。此外,当使用 DRACO_TRANSCODER_SUPPORTED 变量设置为 ON 运行 CMake 时,会生成 draco_transcoder(有关详细信息,请参阅 BUILDING)。对于所有应用程序,如果您在不带任何参数或使用 -h 运行它们,应用程序将输出使用说明和选项。

编码工具

draco_encoder可以读取OBJ、STL或PLY文件作为输入,并输出Draco编码的文件。我们已经包含了斯坦福大学的[Bunny]网格用于测试。基本的命令行如下所示:

./draco_encoder -i testdata/bun_zipper.ply -o out.drc

量化参数值为0时不会对指定属性进行任何量化。任何非0值都会将指定属性的输入值量化为该位数。例如:

./draco_encoder -i testdata/bun_zipper.ply -o out.drc -qp 14

将把位置量化为14位(位置坐标的默认值是11)。

通常,量化属性越多,获得的压缩率就越好。具体容忍多少偏差取决于你的项目。一般来说,大多数项目可以将量化值设置为约11,而不会在质量上产生明显差异。

压缩级别(-cl)参数用于开启或关闭不同的压缩功能。

./draco_encoder -i testdata/bun_zipper.ply -o out.drc -cl 8

通常,最高设置10会有最大压缩率但解压速度最慢。0压缩率最低,但解压速度最快。默认设置是7

编码点云

通过指定-point_cloud参数,你可以使用draco_encoder编码点云数据。如果你为网格输入文件指定-point_cloud参数,draco_encoder将忽略连接数据,只编码网格文件中的位置信息。

./draco_encoder -point_cloud -i testdata/bun_zipper.ply -o out.drc

这个命令行会将网格输入编码为点云,尽管输入可能不会产生代表其他点云的压缩。具体来说,对于更大更密集的点云,可以期待获得更好的压缩率。

解码工具

draco_decoder将读取Draco文件作为输入,并输出OBJ、STL或PLY文件。基本命令行如下所示:

./draco_decoder -i in.drc -o out.obj

glTF转码工具

draco_transcoder可用于为glTF资产添加Draco压缩。基本命令行如下所示:

./draco_transcoder -i in.glb -o out.glb

此命令行将为in.glb文件中的所有网格添加几何压缩。可以像draco_encoder工具一样指定不同glTF属性的量化值。例如,-qp可用于定义位置属性的量化:

./draco_transcoder -i in.glb -o out.glb -qp 12

C++解码器API

如果你想在应用程序中添加解码功能,需要包含draco_dec库。要使用Draco解码器,你需要用压缩数据初始化DecoderBuffer。然后调用DecodeMeshFromBuffer()返回解码后的网格对象,或调用DecodePointCloudFromBuffer()返回解码后的PointCloud对象。例如:

draco::DecoderBuffer buffer;
buffer.Init(data.data(), data.size());

const draco::EncodedGeometryType geom_type =
    draco::GetEncodedGeometryType(&buffer);
if (geom_type == draco::TRIANGULAR_MESH) {
  unique_ptr<draco::Mesh> mesh = draco::DecodeMeshFromBuffer(&buffer);
} else if (geom_type == draco::POINT_CLOUD) {
  unique_ptr<draco::PointCloud> pc = draco::DecodePointCloudFromBuffer(&buffer);
}

完整的Mesh类接口请参见src/draco/mesh/mesh.h,完整的PointCloud类接口请参见src/draco/point_cloud/point_cloud.h

Javascript编码器API

Javascript编码器位于javascript/draco_encoder.js。编码器API可用于压缩网格和点云。要使用编码器,首先需要创建DracoEncoderModule的实例。然后使用这个实例创建MeshBuilderEncoder对象。MeshBuilder用于从几何数据构建可以later被Encoder压缩的网格。首先使用new encoderModule.Mesh()创建网格对象。然后,使用AddFacesToMesh()向网格添加索引,使用AddFloatAttributeToMesh()向网格添加属性数据,如位置、法线、颜色和纹理坐标。构建网格后,可以使用EncodeMeshToDracoBuffer()压缩网格。例如:

const mesh = {
  indices : new Uint32Array(indices),
  vertices : new Float32Array(vertices),
  normals : new Float32Array(normals)
};

const encoderModule = DracoEncoderModule();
const encoder = new encoderModule.Encoder();
const meshBuilder = new encoderModule.MeshBuilder();
const dracoMesh = new encoderModule.Mesh();

const numFaces = mesh.indices.length / 3;
const numPoints = mesh.vertices.length;
meshBuilder.AddFacesToMesh(dracoMesh, numFaces, mesh.indices);

meshBuilder.AddFloatAttributeToMesh(dracoMesh, encoderModule.POSITION,
  numPoints, 3, mesh.vertices);
if (mesh.hasOwnProperty('normals')) {
  meshBuilder.AddFloatAttributeToMesh(
    dracoMesh, encoderModule.NORMAL, numPoints, 3, mesh.normals);
}
if (mesh.hasOwnProperty('colors')) {
  meshBuilder.AddFloatAttributeToMesh(
    dracoMesh, encoderModule.COLOR, numPoints, 3, mesh.colors);
}
if (mesh.hasOwnProperty('texcoords')) {
  meshBuilder.AddFloatAttributeToMesh(
    dracoMesh, encoderModule.TEX_COORD, numPoints, 3, mesh.texcoords);
}

if (method === "edgebreaker") {
  encoder.SetEncodingMethod(encoderModule.MESH_EDGEBREAKER_ENCODING);
} else if (method === "sequential") {
  encoder.SetEncodingMethod(encoderModule.MESH_SEQUENTIAL_ENCODING);
}

const encodedData = new encoderModule.DracoInt8Array();
// 使用默认编码设置。
const encodedLen = encoder.EncodeMeshToDracoBuffer(dracoMesh,
                                                   encodedData);
encoderModule.destroy(dracoMesh);
encoderModule.destroy(encoder);
encoderModule.destroy(meshBuilder);

完整API请参见src/draco/javascript/emscripten/draco_web_encoder.idl。 Javascript 解码器 API

Javascript 解码器位于 javascript/draco_decoder.js。Javascript 解码器可以解码网格和点云。要使用解码器,你必须首先创建一个 DracoDecoderModule 实例。然后使用该实例创建 DecoderBufferDecoder 对象。将编码数据设置到 DecoderBuffer 中。然后调用 GetEncodedGeometryType() 来识别几何体类型,例如网格或点云。接着调用 DecodeBufferToMesh()DecodeBufferToPointCloud(),它们将返回一个 Mesh 对象或点云。例如:

// 创建 Draco 解码器
const decoderModule = DracoDecoderModule();
const buffer = new decoderModule.DecoderBuffer();
buffer.Init(byteArray, byteArray.length);

// 创建一个缓冲区来保存编码数据
const decoder = new decoderModule.Decoder();
const geometryType = decoder.GetEncodedGeometryType(buffer);

// 解码编码的几何体
let outputGeometry;
let status;
if (geometryType == decoderModule.TRIANGULAR_MESH) {
  outputGeometry = new decoderModule.Mesh();
  status = decoder.DecodeBufferToMesh(buffer, outputGeometry);
} else {
  outputGeometry = new decoderModule.PointCloud();
  status = decoder.DecodeBufferToPointCloud(buffer, outputGeometry);
}

// 你必须显式删除从 DracoDecoderModule 或 Decoder 创建的对象
decoderModule.destroy(outputGeometry);
decoderModule.destroy(decoder);
decoderModule.destroy(buffer);

完整的 API 请参见 src/draco/javascript/emscripten/draco_web_decoder.idl

Javascript 解码器性能

Javascript 解码器使用动态内存构建。这将使解码器能够处理所有压缩数据。但这个选项并不是最快的。预分配内存可以看到大约 2 倍的解码器速度提升。如果你知道项目的所有内存需求,你可以通过相应地更改 CMakeLists.txt 来启用静态内存。

元数据 API

从 v1.0 开始,Draco 提供了元数据功能,用于编码几何数据以外的数据。它可以用来编码任何与几何体一起的自定义数据。例如,我们可以启用元数据功能来编码属性名称、子对象名称和自定义信息。 对于一个网格和点云,它可以有一个顶级几何元数据类。顶级元数据然后可以有层次化的元数据。除此之外,顶级元数据可以为每个属性拥有元数据,这被称为属性元数据。属性元数据应该使用网格中相应的属性 ID 进行初始化。元数据 API 在 C++ 和 Javascript 中都提供。 例如,在 C++ 中添加元数据:

draco::PointCloud pc;
// 为几何体添加元数据
std::unique_ptr<draco::GeometryMetadata> metadata =
  std::unique_ptr<draco::GeometryMetadata>(new draco::GeometryMetadata());
metadata->AddEntryString("description", "这是一个例子。");
pc.AddMetadata(std::move(metadata));

// 为属性添加元数据
draco::GeometryAttribute pos_att;
pos_att.Init(draco::GeometryAttribute::POSITION, nullptr, 3,
             draco::DT_FLOAT32, false, 12, 0);
const uint32_t pos_att_id = pc.AddAttribute(pos_att, false, 0);

std::unique_ptr<draco::AttributeMetadata> pos_metadata =
    std::unique_ptr<draco::AttributeMetadata>(
        new draco::AttributeMetadata(pos_att_id));
pos_metadata->AddEntryString("name", "position");

// 直接将属性元数据添加到几何体
// 你可以这样做而不需要显式地将 |GeometryMetadata| 添加到网格
pc.AddAttributeMetadata(pos_att_id, std::move(pos_metadata));

在 C++ 中从几何体读取元数据:

// 获取几何体的元数据
const draco::GeometryMetadata *pc_metadata = pc.GetMetadata();

// 请求特定属性的元数据
const draco::AttributeMetadata *requested_pos_metadata =
  pc.GetAttributeMetadataByStringEntry("name", "position");

完整的 API 请参见 src/draco/metadatasrc/draco/point_cloud

NPM 包

Draco NPM NodeJS 包位于 javascript/npm/draco3d。请参阅该文件夹中的文档以获取详细用法。

three.js 渲染器示例

这里有一个示例,展示了使用 three.js 渲染器通过 Javascript 解码器加载 Draco 压缩的几何体。

更多信息请参见 javascript/example/README.md 文件。

GStatic Javascript 构建

Emscripten 构建的 Draco Javascript 解码器的预构建版本托管在 www.gstatic.com 的版本标记目录中:

https://www.gstatic.com/draco/versioned/decoders/VERSION/*

从 v1.4.3 版本开始,可用的文件有:

从 v1.5.1 版本开始,以下文件的断言启用构建版本可用:

支持

如有问题/评论,请发送电子邮件至 draco-3d-discuss@googlegroups.com

如果你在这个库中发现错误,请在 https://github.com/google/draco/issues 提交问题

我们鼓励提交补丁,可以通过 fork 这个项目并通过 GitHub 提交拉取请求来完成。更多详情请参见 [CONTRIBUTING]。 许可证

根据Apache许可证2.0版("许可证")授权;除非符合许可证,否则您不得使用此文件。您可以在以下位置获得许可证的副本:

http://www.apache.org/licenses/LICENSE-2.0

除非适用法律要求或书面同意,根据许可证分发的软件是基于"按原样"的基础提供的,不附带任何明示或暗示的保证或条件。请参阅许可证以了解特定语言下的权限和限制。

参考文献

斯坦福兔子模型来自斯坦福大学图形学部门 https://graphics.stanford.edu/data/3Dscanrep/

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号