用于 Java 的 FileFormat.Drako
使用 Java API 简化 Google Draco 文件的读取和写入过程
轻松编辑压缩的 DRC 文件,使用 FileFormat.Drako 这一轻量级的开源 Java API,简化 Draco 文件的转换和自动化
FileFormat.Drako for Java 彻底改变了您的 Draco 文件处理体验。在这份综合指南中,我们深入探讨了利用FileFormat.Drako(一种轻量级开源 Java API)的功能和优势,轻松轻松地处理 Draco 文件。
Draco是Google开发的开源压缩库,专门用于压缩和解压缩3D几何网格和点云。通过显着减小 3D 图形文件的大小,Draco 可以实现更快的传输并降低存储要求,同时保持视觉质量。它支持各种 3D 应用程序,包括基于 Web 和移动平台,确保高效处理复杂的 3D 数据。 Draco广泛应用于游戏、虚拟现实和3D可视化等行业,以优化性能并增强用户体验。
FileFormat.Drako 成为无缝读写 Draco 文件的强大解决方案。这个轻量级开源 Java API 简化了 Draco 图像操作,为开发人员和用户提供了一个用户友好的界面来轻松处理 Draco 文件。
FileFormat.Drako 可在Openize 许可证下使用。
主要特性和优点- 高压缩比:Draco 显着减小了文件大小,通常将文件大小减小了 90%,而视觉质量没有明显损失。这使其成为带宽和存储有限的应用程序的理想选择。
- 支持各种数据类型:Draco 支持各种 3D 数据类型的压缩,包括几何网格和点云。它可以有效地处理顶点位置、颜色、法线和其他属性。
- 快速压缩和解压缩:该库旨在提供高速压缩和解压缩,使其适合实时应用程序,例如基于网络的 3D 查看器和虚拟现实体验。
- 开源且免费:享受开源解决方案的优势,无需支付许可费用,所有级别的开发者和用户都可以使用它。
- 与 Java 应用程序无缝集成:轻松地将 FileFormat.Drako 集成到您的 Java 应用程序中,从而在您现有的工作流程中实现无缝的 Draco 文件处理。
- 高压缩比:Draco 显着减小了文件大小,通常将文件大小减小了 90%,而视觉质量没有明显损失。这使其成为带宽和存储有限的应用程序的理想选择。
- 支持各种数据类型:Draco 支持各种 3D 数据类型的压缩,包括几何网格和点云。它可以有效地处理顶点位置、颜色、法线和其他属性。
- 快速压缩和解压缩:该库旨在提供高速压缩和解压缩,使其适合实时应用程序,例如基于网络的 3D 查看器和虚拟现实体验。
- 开源且免费:享受开源解决方案的优势,无需支付许可费用,所有级别的开发者和用户都可以使用它。
- 与 Java 应用程序无缝集成:轻松地将 FileFormat.Drako 集成到您的 Java 应用程序中,从而在您现有的工作流程中实现无缝的 Draco 文件处理。
如何开始使用FileFormat.Drako for Java
FileFormat.Drako 入门既快速又简单。只需按照以下步骤操作:
- InstallFileFormat.Drako:通过 Maven 或 Gradle 安装 FileFormat.Drako 包。
- 开始转换:利用FileFormat.Drako提供的简单API来读写Draco文件。
为 Java 安装FileFormat.Drako 的推荐方法是使用 maven。请使用以下 pom 依赖片段以顺利安装。
POM 片段
<dependency>
<groupId>org.openize</groupId>
<artifactId>drako</artifactId>
<version>1.4.0</version>
</dependency>
您还可以直接从 GitHub 下载它。用Java将Draco文件读入DracoMesh
此代码片段有效加载 Draco 文件,并将其存储在 DracoMesh 实例中以供后续操作。
- 使用
Files.readAllBytes
打开名为“cube.drc”的 DRC 文件。 - 将 3D 网格从字节加载到
DracoMesh
对象中。
将下面的代码片段复制并粘贴到主文件中并执行程序。
读取.drc文件到DracoMesh实例
byte[] cube = Files.readAllBytes(Paths.get("cube.drc"));
DracoMesh dm = (DracoMesh)Draco.decode(cube);
用 Java 读取 Draco 文件并写入 Wavefront OBJ
以下代码说明了如何打开现有的 3D Draco 文件,并写入 obj 格式以进行进一步处理:
- 使用
Files.readAllBytes
打开名为“input.drc”的 Draco 文件。 - 将 Draco 网格从字节加载到
DracoMesh
对象中。 - 使用
DracoMesh.getNamedAttribute
查找位置属性,并将其内容转换为FloatSpan
。 - 使用 OBJ 格式将控制点写入输出。
- 使用
DracoMesh.readFace
读取每个面角 - 使用
PointAttribute.mappedIndex
将面角映射到控制点索引。 - 使用 OBJ 格式将面写入输出。
将下面的代码片段复制并粘贴到主文件中并执行程序。
将.drc文件读取到DracoMesh并导出到wavefront obj
//load draco file
byte[] bytes = Files.readAllBytes(Paths.get("input.drc"));
DracoMesh mesh = (DracoMesh)Draco.decode(bytes);
if (mesh == null)
throw new IllegalStateException("Input file is not a valid draco file.");
PointAttribute attrPos = mesh.getNamedAttribute(AttributeType.POSITION);
FloatSpan points = attrPos.getBuffer().asSpan().asFloatSpan();
try(FileOutputStream fos = new FileOutputStream("output.obj", false)) {
try (OutputStreamWriter writer = new OutputStreamWriter(fos)) {
for (int i = 0; i < points.size(); i += 3) {
writer.write(String.format("v %f %f %f\n", points.get(i), points.get(i + 1), points.get(i + 2)));
}
int[] face = new int[3];
for (int i = 0; i < mesh.getNumFaces(); i++) {
mesh.readFace(i, face);
int a = attrPos.mappedIndex(face[0]) + 1;
int b = attrPos.mappedIndex(face[1]) + 1;
int c = attrPos.mappedIndex(face[2]) + 1;
writer.write(String.format("f %d %d %d\n", a, b, c));
}
}
}
用 Java 编程方式将控制点、三角形编码到 Draco 文件
提供的代码演示了如何以编程方式从控制点和三角形创建 Draco 文件,并使用 Java 将其保存为“output.drc”。以下是具体步骤:
- 创建一个
DracoMesh
实例。 - 将控制点包裹到
PointAttribute
。 - 将
PointAttribute
添加到DracoMesh
。 - 添加三角形索引。
- 使用指定的编码参数创建一个
DracoEncodeOptions
对象。 - 使用
Draco.encode
将网格编码为字节。
将下面的代码片段复制并粘贴到主文件中并执行程序。
将矢量和面编码到 .drc 文件
Vector3[] controlPoints = new Vector3[]
{
new Vector3( -5, 0, 5.0f),
new Vector3( 5, 0, 5.0f),
new Vector3( 5, 10, 5.0f),
new Vector3( -5, 10, 5.0f),
new Vector3( -5, 0, -5.0f),
new Vector3( 5, 0, -5.0f),
new Vector3( 5, 10, -5.0f),
new Vector3( -5, 10, -5.0f)
};
int[] indices = new int[]
{
0,1,2, 0, 2, 3, // Front face (Z+)
1,5,6, 1, 6, 2, // Right side (X+)
5,4,7, 5, 7, 6, // Back face (Z-)
4,0,3, 4, 3, 7, // Left side (X-)
0,4,5, 0, 5, 1, // Bottom face (Y-)
3,2,6, 3, 6, 7 // Top face (Y+)
};
DracoMesh mesh = new DracoMesh();
PointAttribute attrPos = PointAttribute.wrap(AttributeType.POSITION, controlPoints);
mesh.addAttribute(attrPos);
//add triangle indices
mesh.getIndices().addRange(indices);
//number of the control points, it's required for the encoder to produce correct result.
mesh.setNumPoints(8);
//You can also use following methods to deduplicate the attributes to reduce the file size
//mesh.deduplicateAttributeValues();
//mesh.deduplicatePointIds();
DracoEncodeOptions opt = new DracoEncodeOptions();
byte[] drcBytes = Draco.encode(mesh, opt);
Files.write(Paths.get("output.drc"), drcBytes);
FileFormat.Drako 提供直观的 API、全面的格式支持以及与 Java 应用程序的无缝集成,使开发人员和用户能够轻松管理 Draco 文件。无论您是将 draco 文件转换为其他文件,还是加载 draco 进行渲染,FileFormat.Drako 都能简化流程,确保每一步都达到最佳效率和质量。
探索我们的 GitHub 存储库以做出贡献、提出改进建议并增强此开源 API:FileFormat.Drako- for-Java