google/draco
GitHub: google/draco
Draco 是一个用于压缩和解压缩 3D 几何网格与点云的库,旨在提升存储与传输效率。
Stars: 7231 | Forks: 1051
[](https://github.com/google/draco/actions/workflows/ci.yml)
# 新闻
GStatic 用户请注意:Draco 团队强烈建议使用版本化的
URLs 来访问 Draco GStatic 内容。如果您使用的 URL 包含
`v1/decoders` 子字符串,可能会由于边缘缓存和 GStatic 传播延迟导致暂时性错误,
尤其是在新的 Draco 版本发布时难以诊断。为了避免此问题,请将您的站点固定到
版本化发布。
### 版本 1.5.7 发布:
* 继续推荐使用版本化的 www.gstatic.com WASM 和 JavaScript 解码器。要使用 v1.5.7,请使用以下 URL:
* https://www.gstatic.com/draco/versioned/decoders/1.5.7/*
* 增强了对归一化属性的 Emscripten 编码器 API 的支持。
* 错误修复。
* 安全修复。
### 版本 1.5.6 发布:
* 继续推荐使用版本化的 www.gstatic.com WASM 和 JavaScript 解码器。要使用 v1.5.6,请使用以下 URL:
* https://www.gstatic.com/draco/versioned/decoders/1.5.6/*
* CMake 标志 DRACO_DEBUG_MSVC_WARNINGS 已被 DRACO_DEBUG_COMPILER_WARNINGS 替换,且行为已更改。
* 现在它是一个在 draco_options.cmake 中定义的布尔标志。
* 错误修复。
* 安全修复。
### 版本 1.5.5 发布:
* 继续推荐使用版本化的 www.gstatic.com WASM 和 JavaScript 解码器。要使用 v1.5.5,请使用以下 URL:
* https://www.gstatic.com/draco/versioned/decoders/1.5.5/*
* 错误修复:https://github.com/google/draco/issues/935
### 版本 1.5.4 发布:
* 继续推荐使用版本化的 www.gstatic.com WASM 和 JavaScript 解码器。要使用 v1.5.4,请使用以下 URL:
* https://www.gstatic.com/draco/versioned/decoders/1.5.4/*
* 增强了对 glTF 扩展 EXT_mesh_features 和 EXT_structural_metadata 的部分支持。
* 错误修复。
* 安全修复。
### 版本 1.5.3 发布:
* 继续推荐使用版本化的 www.gstatic.com WASM 和 JavaScript 解码器。要使用 v1.5.3,请使用以下 URL:
* https://www.gstatic.com/draco/versioned/decoders/1.5.3/*
* 错误修复。
### 版本 1.5.2 发布
* 这与 v1.5.1 相同,但包含以下两个错误修复:
* 修复了 DRACO_TRANSCODER_SUPPORTED 启用构建的问题。
* ABI 版本已更新。
### 版本 1.5.1 发布
* 为 Emscripten 构建添加了断言启用版本,并在 GStatic 中添加了部分断言启用构建。
* 有关文件列表,请参见下文。
* 现在支持自定义路径指向第三方依赖项。更多详细信息请参见 BUILDING.md。
* 已测试并确认 draco-config.cmake 可在 Linux、MacOS 和 Windows CMake 项目中使用。
* 更多信息请参见 `src/draco/tools` 目录下的 `install_test` 子目录。
* 错误修复。
### 版本 1.5.0 发布
* 新增 draco_transcoder 工具。有关 glTF 转码工具的详细信息,请参见下文以及 BUILDING.md 中的构建和依赖信息。
* 对配置变量进行了一些更改:
- DRACO_GLTF 标志已重命名为 DRACO_GLTF_BITSTREAM,以帮助
- 更清楚地了解其用途,即限制 Draco 功能仅包含 Draco glTF 规范中定义的功能。
- 通过 draco-config.cmake 和 find-draco.cmake(以前称为 FindDraco.cmake)导出的变量已重命名。
- 这不太可能影响任何现有项目,因为上述文件本来就不正确。
- 有关完整详细信息,请参见 [PR775](https://github.com/google/draco/pull/775)。
* 新增了 CMake 版本文件。
* CMake 安装目标现在直接使用 CMake 的绝对路径,而不是使用 CMAKE_INSTALL_PREFIX 构建。
- 这样可以使 Draco 更易于被下游打包者使用,并且对从源码获取 Draco 的用户几乎没有影响。
* 已更改某些 MSVC 警告级别以通过编译器标志减少 MSVC 编译器输出的噪声。
- 将 MSVC 警告级别设置为 4,或在 CMake 配置时定义 DRACO_DEBUG_MSVC_WARNINGS 以恢复以前的行为。
* 错误修复。
### 版本 1.4.3 发布
* 继续推荐使用版本化的 www.gstatic.com WASM 和 JavaScript 解码器。要使用 v1.4.3,请使用以下 URL:
* https://www.gstatic.com/draco/versioned/decoders/1.4.3/*
* 错误修复
### 版本 1.4.1 发布
* 现在推荐使用版本化的 www.gstatic.com WASM 和 JavaScript 解码器。要使用 v1.4.1,请使用以下 URL:
* https://www.gstatic.com/draco/versioned/decoders/1.4.1/*
* 将 * 替换为要加载的文件。例如:
* https://www.gstatic.com/draco/versioned/decoders/1.4.1/draco_decoder.js
* 这适用于 v1.3.6 和 v1.4.0 版本,并且适用于未来的 Draco 版本。
* 错误修复
### 版本 1.4.0 发布
* WASM 和 JavaScript 解码器已从静态 URL 提供。
* 建议始终从此 URL 拉取 Draco WASM 和 JavaScript 解码器:
* https://www.gstatic.com/draco/v1/decoders/*
* 将 * 替换为要加载的文件。例如:
* https://www.gstatic.com/draco/v1/decoders/draco_decoder_gltf.wasm
* 用户将从缓存中受益,因为越来越多的站点开始使用静态 URL。
* 将 npm 模块更改为使用 WASM,这使性能提高了约 200%。
* 更新 Emscripten 到 2.0。
* 这导致 Draco 编解码器模块返回 Promise 而不是直接返回模块。
* 请参阅示例代码以了解如何处理 Promise。
* 将 NORMAL 量化默认值更改为 8。
* 新增数组 API 到解码器,并废弃 DecoderBuffer。
* 有关更多信息,请参见 PR https://github.com/google/draco/issues/513。
* 更改 WASM/JavaScript 异常捕获行为。
* 有关更多信息,请参见问题 https://github.com/google/draco/issues/629。
* 代码清理。
* Emscripten 构建现在禁用了 NODEJS_CATCH_EXIT 和 NODEJS_CATCH_REJECTION。
* CLI 工具的作者可能需要添加自己的错误处理程序。
* 新增 Maya 插件构建。
* 更新 Unity 插件构建。
* 构建现在以归档形式存储。
* 新增 iOS 构建。
* Unity 用户可能希望查看 https://github.com/atteneder/DracoUnity。
* 错误修复。
### 版本 1.3.6 发布
* WASM 和 JavaScript 解码器现在从静态 URL 提供。
* 建议始终从此 URL 拉取 Draco WASM 和 JavaScript 解码器:
* https://www.gstatic.com/draco/v1/decoders/*
* 将 * 替换为要加载的文件。例如:
* https://www.gstatic.com/draco/v1/decoders/draco_decoder_gltf.wasm
* 用户将从缓存中受益,因为越来越多的站点开始使用静态 URL。
* 更改 Web 示例以从静态 URL 拉取 Draco 解码器。
* 新增 Draco WASM 解码器的新 API,性能提升约 15%。
* Draco WASM 解码器大小减少了约 20%。
* 新增对通用属性和多个属性的 Draco Unity 插件支持。
* 新增 Draco Unity 的新 API,解码器性能提升约 15%。
* 更改量化默认值:
- POSITION: 11
- NORMAL: 7
- TEX_COORD: 10
- COLOR: 8
- GENERIC: 8
* 代码清理。
* 错误修复。
### 版本 1.3.5 发布
* 新增选项以构建适用于 Universal Scene Description 的 Draco。
*清理。
* 错误修复。
### 版本 1.3.4 发布
* 发布了 Draco Animation 代码。
* 针对 Unity 的修复。
* 各种文件位置和名称更改。
### 版本 1.3.3 发布
* 新增 ExpertEncoder 到 JavaScript API。
* 允许开发者为每个属性 ID 设置量化选项。
* 错误修复。
### 版本 1.3.2 发布
* 错误修复。
### 版本 1.3.1 发布
* 修复了在跳过属性变换时处理多个属性的问题。
### 版本 1.3.0 发布
* 改进了基于 kD-tree 的点云编码。
* 现在适用于具有任意数量属性的点云。
* 支持所有整数属性类型和量化浮点类型。
* 网格压缩率最高提升 10%(平均约 2%)。
* 对于网格,1.3.0 位流与 1.2.x 解码器完全兼容。
* 改进了 JavaScript API。
* 新增对所有有符号和无符号整数类型的支持。
* 新增对点云到 JavaScript 编码器 API 的支持。
* 新增对整数属性到 PLY 解码器的支持。
* 错误修复。
### 早期版本
https://github.com/google/draco/releases
# 描述
Draco 是一种用于压缩和解压缩 3D 几何[网格]和
[点云]的库。其目的是改善 3D 图形
的存储和传输。
Draco 的设计目标是压缩效率和速度。代码
支持压缩点、连接信息、纹理坐标、
颜色信息、法线以及与几何相关的任何其他通用属性。
有了 Draco,使用 3D 图形的应用程序可以显著
更小,而不会牺牲视觉保真度。对用户来说,这意味着
应用程序可以更快下载,浏览器中的 3D 图形加载更快,
而 VR 和 AR 场景现在可以以更少带宽传输并快速渲染。
Draco 以 C++ 源代码形式发布,可用于压缩 3D 图形
以及用于编码数据的 C++ 和 JavaScript 解码器。
_**目录**_
* [构建](#building)
* [用法](#usage)
* [Unity](#unity)
* [WASM 和 JavaScript 解码器](#WASM-and-JavaScript-Decoders)
* [命令行应用程序](#command-line-applications)
* [编码工具](#encoding-tool)
* [编码点云](#encoding-point-clouds)
* [解码工具](#decoding-tool)
* [glTF 转码工具](#gltf-transcoding-tool)
* [C++ 解码器 API](#c-decoder-api)
* [JavaScript 编码器 API](#javascript-encoder-api)
* [JavaScript 解码器 API](#javascript-decoder-api)
* [JavaScript 解码器性能](#javascript-decoder-performance)
* [元数据 API](#metadata-api)
* [NPM 包](#npm-package)
* [three.js 渲染器示例](#threejs-renderer-example)
* [GStatic JavaScript 构建](#gstatic-javascript-builds)
* [支持](#support)
* [许可证](#license)
* [参考资料](#references)
# 构建
请参见 [BUILDING](BUILDING.md) 获取构建说明。
# 用法
## Unity
关于在 Unity 中使用 Draco 的最佳信息,请访问 https://github.com/atteneder/DracoUnity
有关使用 Unity 和 Draco 的简单示例,请参见 unity 文件夹中的 [README](unity/README.md)。
## WASM 和 JavaScript 解码器
建议始终从以下位置拉取 Draco WASM 和 JavaScript 解码器:
```
https://www.gstatic.com/draco/v1/decoders/
```
用户将从缓存中受益,因为越来越多的站点开始使用静态 URL。
## 命令行应用程序
默认目标将从构建文件创建 `draco_encoder`
和 `draco_decoder` 命令行应用程序。此外,当使用
CMake 并设置 DRACO_TRANSCODER_SUPPORTED 变量为 ON 时,会生成 `draco_transcoder`
(有关更多详细信息,请参见 [BUILDING](BUILDING.md#transcoder))。对于所有
应用程序,如果在不带任何参数或 `-h` 的情况下运行它们,应用程序将
输出用法和选项。
## 编码工具
`draco_encoder` 将读取 OBJ、STL 或 PLY 文件作为输入,并输出
Draco 编码文件。我们包含了斯坦福的 [Bunny] 网格用于测试。基本命令行如下:
```
./draco_encoder -i testdata/bun_zipper.ply -o out.drc
```
量化参数为 `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` 文件中的所有网格添加几何压缩。
可以类似地为不同的 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
mesh = draco::DecodeMeshFromBuffer(&buffer);
} else if (geom_type == draco::POINT_CLOUD) {
unique_ptr pc = draco::DecodePointCloudFromBuffer(&buffer);
}
```
请参见 [src/draco/mesh/mesh.h](src/draco/mesh/mesh.h) 获取完整的 `Mesh` 类接口以及
[src/draco/point_cloud/point_cloud.h](src/draco/point_cloud/point_cloud.h) 获取完整的 `PointCloud` 类接口。
## JavaScript 编码器 API
JavaScript 编码器位于 `javascript/draco_encoder.js`。编码器
API 可用于压缩网格和点云。要使用编码器,您需要
首先创建 `DracoEncoderModule` 的实例。然后使用此实例创建
`MeshBuilder` 和 `Encoder` 对象。`MeshBuilder` 用于
构建网格,之后可由 `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();
// Use default encoding setting.
const encodedLen = encoder.EncodeMeshToDracoBuffer(dracoMesh,
encodedData);
encoderModule.destroy(dracoMesh);
encoderModule.destroy(encoder);
encoderModule.destroy(meshBuilder);
```
请参见 [src/draco/javascript/emscripten/draco_web_encoder.idl](src/draco/javascript/emscripten/draco_web_encoder.idl) 获取完整 API。
## JavaScript 解码器 API
JavaScript 解码器位于 [javascript/draco_decoder.js](javascript/draco_decoder.js)。
要使用解码器,您需要首先创建 `DracoDecoderModule` 的实例。
然后使用该实例创建 `DecoderBuffer` 和 `Decoder` 对象。
将编码数据设置到 `Buffer` 中。然后调用
`GetEncodedGeometryType()` 以识别几何类型,例如网格或点云。
然后调用 `DecodeBufferToMesh()` 或 `DecodeBufferToPointCloud()`,
这将返回一个网格对象或点云。例如:
```
// Create the Draco decoder.
const decoderModule = DracoDecoderModule();
const buffer = new decoderModule.DecoderBuffer();
buffer.Init(byteArray, byteArray.length);
// Create a buffer to hold the encoded data.
const decoder = new decoderModule.Decoder();
const geometryType = decoder.GetEncodedGeometryType(buffer);
// Decode the encoded geometry.
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);
}
// You must explicitly delete objects created from the DracoDecoderModule
// or Decoder.
decoderModule.destroy(outputGeometry);
decoderModule.destroy(decoder);
decoderModule.destroy(buffer);
```
请参见 [src/draco/javascript/emscripten/draco_web_decoder.idl](src/draco/javascript/emscripten/draco_web_decoder.idl) 获取完整 API。
## JavaScript 解码器性能
JavaScript 解码器使用动态内存。这使解码器
能够处理所有压缩数据。但此选项并非最快。
预分配内存可使解码速度提升约 2 倍。如果您知道项目的所有内存需求,
可以通过相应修改 `CMakeLists.txt` 来启用静态内存。
## 元数据 API
从 v1.0 开始,Draco 提供元数据功能,用于编码几何
以外的数据。它可用于在几何体旁边编码任何自定义数据。例如,
我们可以启用元数据功能来编码属性名称、子对象名称和自定义信息。
对于一个网格和一个点云,它可以拥有一个顶级几何元数据类。
顶级元数据可以有分层元数据。除此之外,
顶级元数据还可以为每个属性拥有元数据,称为
属性元数据。属性元数据应使用网格中的相应属性 ID 进行初始化。
元数据 API 在 C++ 和 JavaScript 中都提供。
例如,要在 C++ 中添加元数据:
```
draco::PointCloud pc;
// Add metadata for the geometry.
std::unique_ptr metadata =
std::unique_ptr(new draco::GeometryMetadata());
metadata->AddEntryString("description", "This is an example.");
pc.AddMetadata(std::move(metadata));
// Add metadata for attributes.
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 pos_metadata =
std::unique_ptr(
new draco::AttributeMetadata(pos_att_id));
pos_metadata->AddEntryString("name", "position");
// Directly add attribute metadata to geometry.
// You can do this without explicitly add |GeometryMetadata| to mesh.
pc.AddAttributeMetadata(pos_att_id, std::move(pos_metadata));
```
要从几何体读取元数据(C++):
```
// Get metadata for the geometry.
const draco::GeometryMetadata *pc_metadata = pc.GetMetadata();
// Request metadata for a specific attribute.
const draco::AttributeMetadata *requested_pos_metadata =
pc.GetAttributeMetadataByStringEntry("name", "position");
```
请参见 [src/draco/metadata](src/draco/metadata) 和 [src/draco/point_cloud](src/draco/point_cloud) 获取完整 API。
## NPM 包
Draco NPM NodeJS 包位于 [javascript/npm/draco3d](javascript/npm/draco3d)。请参见该文件夹中的文档以获取详细用法。
## three.js 渲染器示例
这是一个 [示例],展示了使用 JavaScript 解码器通过
`three.js` 渲染器加载的压缩几何体。
请参见 [javascript/example/README.md](javascript/example/README.md) 文件以获取更多信息。
# GStatic JavaScript 构建
预先构建的 Emscripten 构建的 Draco JavaScript 解码器托管在
www.gstatic.com 的版本化目录中:
https://www.gstatic.com/draco/versioned/decoders/VERSION/*
从 v1.4.3 版本开始,可用的文件包括:
- [draco_decoder.js](https://www.gstatic.com/draco/versioned/decoders/1.4.3/draco_decoder.js)
- [draco_decoder.wasm](https://www.gstatic.com/draco/versioned/decoders/1.4.3/draco_decoder.wasm)
- [draco_decoder_gltf.js](https://www.gstatic.com/draco/versioned/decoders/1.4.3/draco_decoder_gltf.js)
- [draco_decoder_gltf.wasm](https://www.gstatic.com/draco/versioned/decoders/1.4.3/draco_decoder_gltf.wasm)
- [draco_wasm_wrapper.js](https://www.gstatic.com/draco/versioned/decoders/1.4.3/draco_wasm_wrapper.js)
- [draco_wasm_wrapper_gltf.js](https://www.gstatic.com/draco/versioned/decoders/1.4.3/draco_wasm_wrapper_gltf.js)
从 v1.5.1 版本开始,以下文件的断言启用版本可用:
- [draco_decoder.js](https://www.gstatic.com/draco/versioned/decoders/1.5.1/with_asserts/draco_decoder.js)
- [draco_decoder.wasm](https://www.gstatic.com/draco/versioned/decoders/1.5.1/with_asserts/draco_decoder.wasm)
- [draco_wasm_wrapper.js](https://www.gstatic.com/draco/versioned/decoders/1.5.1/with_asserts/draco_wasm_wrapper.js)
# 支持
如有问题/建议,请发送邮件至
如果在本库中发现错误,请在
提交问题。欢迎提交补丁,您可以通过 fork 本项目并通过 GitHub 提交 pull request。
请参见 [CONTRIBUTING](https://github.com/google/draco/blob/main/CONTRIBUTING.md) 获取更多详细信息。
# 许可证
根据 Apache License, Version 2.0(“许可证”)授权;您不得
使用此文件,除非符合许可证要求。您可以获得许可证副本:
除非适用法律要求或书面同意,否则根据许可证分发的软件
按“原样”分发,不提供任何形式的明示或暗示的保证或条件。
请参见许可证,了解具体的权限和限制。
# 参考资料
Bunny 模型来自斯坦福图形部门的 标签:3D 传输优化, 3D 图形压缩, 3D 网格压缩, AI工具, API哈希动态解析, Bug 修复, CI 持续集成, Draco 库, EMScripten 编码器, EXT_mesh_features, EXT_structural_metadata, glTF 扩展, Google 开源, GStatic CDN, JavaScript 解码器, SEO: 3D 模型压缩, SEO: Draco 压缩, SEO: 点云优化, WASM 解码器, WebAssembly, 几何数据压缩, 图形引擎优化, 存储优化, 安全修复, 实时传输, 归一化属性, 数据可视化, 点云压缩, 点云编码, 版本化 URL, 网格编码