【3D数据读取】利用JAVA读取GLB(GLTF)文件数据

2023-12-20 10:12
文章标签 java 数据 读取 3d glb gltf

本文主要是介绍【3D数据读取】利用JAVA读取GLB(GLTF)文件数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

了解GLB和GLTF:

  • GLB和GLTF是用于共享3D数据的标准化文件格式。
  • GLB是GLTF的二进制格式,而GLTF基于JSON,一种基于文本的数据格式。
GLB文件:

        由一个头部和一个二进制数据块组成。头部包含文件的元数据,例如文件版本、文件大小、模型的几何信息等。二进制数据块包含模型的实际数据,例如顶点、索引、纹理坐标等。

GLTF文件

        一个JSON文件和一个或多个纹理文件组成。JSON文件包含模型的元数据和描述模型的几何信息、材质信息等。纹理文件包含模型的纹理数据。

主要区别如下:
  • **文件格式:**GLB文件是二进制格式,而GLTF文件是基于文本的JSON格式。
  • **文件大小:**GLB文件通常比GLTF文件小,因为二进制格式可以更有效地存储数据。
  • **兼容性:**GLB文件和GLTF文件都兼容WebGL、OpenGL和其他3D图形API。

GLB文件和GLTF文件的选择取决于具体应用场景

        如果需要更小文件大小,则可以使用GLB文件。如果需要更灵活的数据访问,则可以使用GLTF文件。

以下是一些使用GLB文件和GLTF文件的示例:

  • **使用GLB文件:**GLB文件通常用于在Web应用程序中加载3D模型。例如,在WebGL游戏中,可以使用GLB文件加载游戏中的3D角色和场景。
  • **使用GLTF文件:**GLTF文件通常用于在3D建模软件中创建和编辑3D模型。例如,在Blender中,可以使用GLTF文件导出3D模型。

读取GLB文件

GLB文件由一个头部和一个二进制数据块组成。头部包含文件的元数据,例如文件版本、文件大小、模型的几何信息等。二进制数据块包含模型的实际数据,例如顶点、索引、纹理坐标等。

要使用Java读取GLB文件,可以使用以下步骤:

  1. 使用FileInputStream类打开GLB文件。
  2. 使用DataInputStream类读取GLB文件的头部。
  3. 使用DataInputStream类读取GLB文件的二进制数据块。

以下是一个使用Java读取GLB文件的示例:

import java.io.FileInputStream;
import java.io.DataInputStream;public class GltfReader {public static void main(String[] args) throws Exception {// 打开GLB文件FileInputStream inputStream = new FileInputStream("my-file.glb");// 读取GLB文件的头部DataInputStream dataInputStream = new DataInputStream(inputStream);int version = dataInputStream.readInt();int fileSize = dataInputStream.readInt();// 读取GLB文件的二进制数据块byte[] data = new byte[fileSize];dataInputStream.readFully(data);// 处理GLB文件的数据// ...// 关闭输入流inputStream.close();}
}

在上述示例中,我们首先使用FileInputStream类打开GLB文件。然后,我们使用DataInputStream类读取GLB文件的头部,并获取文件版本和文件大小。最后,我们使用DataInputStream类读取GLB文件的二进制数据块。

GLB文件的二进制数据块的结构如下:

GLB文件的二进制数据块由以下几个部分组成:* 模型信息:包含模型的名称、作者、版本等信息。
* 几何信息:包含模型的顶点、索引、纹理坐标等信息。
* 材质信息:包含模型的材质属性,例如颜色、纹理等信息。
* 动画信息:包含模型的动画信息。

要读取GLB文件的具体数据,可以根据GLB文件的二进制数据块的结构进行处理。例如,要读取模型的顶点信息,可以使用以下代码:

// 读取模型的顶点信息
int vertexCount = dataInputStream.readInt();
float[] vertices = new float[vertexCount * 3];
for (int i = 0; i < vertexCount; i++) {vertices[i * 3] = dataInputStream.readFloat();vertices[i * 3 + 1] = dataInputStream.readFloat();vertices[i * 3 + 2] = dataInputStream.readFloat();
}

上述代码读取了GLB文件中的顶点信息,并将顶点信息保存到vertices数组中。

更多关于GLB文件的详细信息,可以参考Khronos Group的GLB文件规范: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.mdicon-default.png?t=N7T8https://github.com/KhronosGroup/glTF/blob/master/specification/2%3C/0%3E.0/README.md

读取GLTF文件

  1. 使用FileInputStream类打开GLTF文件。
  2. 使用Gson类将GLTF文件的JSON数据解析为一个GLTF对象。
  3. 使用GLTF对象访问模型的各个部分的数据。

以下是一个使用Java读取GLTF文件的示例:

import java.io.FileInputStream;
import com.google.gson.Gson;public class GltfReader {public static void main(String[] args) throws Exception {// 打开GLTF文件FileInputStream inputStream = new FileInputStream("my-file.gltf");// 将GLTF文件的JSON数据解析为一个GLTF对象Gson gson = new Gson();Gltf gltf = gson.fromJson(new InputStreamReader(inputStream), Gltf.class);// 访问模型的各个部分的数据// ...// 关闭输入流inputStream.close();}
}

在上述示例中,我们首先使用FileInputStream类打开GLTF文件。然后,我们使用Gson类将GLTF文件的JSON数据解析为一个Gltf对象。Gltf对象包含模型的所有数据,包括模型的名称、作者、版本、几何信息、材质信息、动画信息等。

要访问模型的各个部分的数据,可以使用Gltf对象的属性和方法。例如,要访问模型的顶点信息,可以使用以下代码:

// 访问模型的顶点信息
float[] vertices = gltf.meshes[0].primitives[0].attributes.get("POSITION").floatValues;

// 上述代码获取了模型的第一个网格(mesh)的第一个几何体(primitive)的顶点信息,并将顶点信息保存到vertices数组中。

// 更多关于GLTF文件的详细信息,请参考Khronos Group的GLTF文件规范: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.mdicon-default.png?t=N7T8https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md

// 读取模型的名称
String name = gltf.name;
// 读取模型的作者
String author = gltf.author;
// 读取模型的版本
int version = gltf.version;
// 读取模型的顶点信息
float[] vertices = gltf.meshes[0].primitives[0].attributes.get("POSITION").floatValues;
// 读取模型的索引信息
short[] indices = gltf.meshes[0].primitives[0].indices;
// 读取模型的纹理信息
TextureInfo[] textures = gltf.textures;
// 读取模型的动画信息
Animation[] animations = gltf.animations;

这篇关于【3D数据读取】利用JAVA读取GLB(GLTF)文件数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/515647

相关文章

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma