GStatic用户请注意:Draco团队强烈建议使用带版本号的URL来访问Draco GStatic内容。如果您使用的URL中包含"v1/decoders"子字符串,当新的Draco版本发布时,边缘缓存和GStatic传播延迟可能会导致难以诊断的临时错误。为避免这个问题,请将您的网站固定到特定版本。
src/draco/tools
目录下的install_test
子目录。https://github.com/google/draco/releases
Draco 是一个用于压缩和解压缩 3D 几何网格和点云的库。它旨在改善 3D 图形的存储和传输。
Draco 的设计和构建注重压缩效率和速度。该代码支持压缩点、连接信息、纹理坐标、颜色信息、法线以及与几何相关的任何其他通用属性。使用 Draco,使用 3D 图形的应用程序可以显著缩小,而不会影响视觉保真度。对于用户来说,这意味着应用程序现在可以更快地下载,浏览器中的 3D 图形可以更快地加载,VR 和 AR 场景现在可以用更少的带宽传输并快速渲染。
Draco 以 C++ 源代码的形式发布,可用于压缩 3D 图形,同时还提供用于编码数据的 C++ 和 Javascript 解码器。
目录
有关构建说明,请参阅 BUILDING。
有关在 Unity 中使用 Draco 的最佳信息,请访问 https://github.com/atteneder/DracoUnity
有关在 Unity 中使用 Draco 的简单示例,请参阅 unity 文件夹中的 README。
建议始终从以下地址获取 Draco WASM 和 JavaScript 解码器:
https://www.gstatic.com/draco/v1/decoders/
随着越来越多的网站开始使用静态 URL,用户将受益于在缓存中保存 Draco 解码器。
从构建文件创建的默认目标将是 draco_encoder
和 draco_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
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
如果你想在应用程序中添加解码功能,需要包含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编码器位于javascript/draco_encoder.js
。编码器API可用于压缩网格和点云。要使用编码器,首先需要创建DracoEncoderModule
的实例。然后使用这个实例创建MeshBuilder
和Encoder
对象。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);
Javascript 解码器位于 javascript/draco_decoder.js。Javascript 解码器可以解码网格和点云。要使用解码器,你必须首先创建一个 DracoDecoderModule
实例。然后使用该实例创建 DecoderBuffer
和 Decoder
对象。将编码数据设置到 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 解码器使用动态内存构建。这将使解码器能够处理所有压缩数据。但这个选项并不是最快的。预分配内存可 以看到大约 2 倍的解码器速度提升。如果你知道项目的所有内存需求,你可以通过相应地更改 CMakeLists.txt
来启用静态内存。
从 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/metadata 和 src/draco/point_cloud。
Draco NPM NodeJS 包位于 javascript/npm/draco3d。请参阅该文件夹中的文档以获取详细用法。
这里有一个示例,展示了使用 three.js
渲染器通过 Javascript 解码器加载 Draco 压缩的几何体。
更多信息请参见 javascript/example/README.md 文件。
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 提交问题
根据Apache许可证2.0版("许可证")授权;除非符合许可证,否则您不得使用此文件。您可以在以下位置获得许可证的副本:
http://www.apache.org/licenses/LICENSE-2.0
除非适用法律要求或书面同意,根据许可证分发的软件是基于"按原样"的基础提供的,不附带任何明示或暗示的保证或条件。请参阅许可证以了解特定语言下的权限和限制。
斯坦福兔子模型来自斯坦福大学图形学部门 https://graphics.stanford.edu/data/3Dscanrep/
一键生成PPT和Word,让学习生活更轻松
讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。
深度推理能力全新升级,全面对标OpenAI o1
科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。
一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型
Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。
字节跳动发布的AI编程神器IDE
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。
AI助力,做PPT更简单!
咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。
选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。
专业的AI公文写作平台,公文写作神器
AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。
OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。
openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。
高分辨率纹理 3D 资产生成
Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。
一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。
3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能 和可靠性,是分布式存储领域的优质解决方案。