【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

相关文章

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF