【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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/233627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】数据结构——链式二叉树实例探究

&#x1f497;个人主页&#x1f497; ⭐个人专栏——数据结构学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 导读&#xff1a; 我们在前面学习了单链表&#xff0c;顺序表&#xff0c;栈和队列&#xff0c;小堆。 今天我们来学习链式二叉…

MATLAB 主成分分析PCA拟合平面点云 (42)

MATLAB 主成分分析PCA拟合平面点云 (42) 一、算法介绍二、算法实现一、算法介绍 主成分分析(Principal Component Analysis,PCA)是一种常用的数据降维和特征提取技术。它的主要思想是通过线性变换将数据投影到一个新的坐标系,使得在新的坐标系中数据的方差最大化。在3D点…

java读取含有合并单元格的Excel

java读取含有合并单元格的Excel Excel如下&#xff1a; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.*;import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.…

springboot学习笔记(二)

1.Spring 和SpringBoot区别 2.Web开发入门 3.MVC模型 4.RequestMapping用法 5.RESTful 1.Spring 和SpringBoot区别 参考&#xff1a; 大家都懂Spring和SpringBoot的区别吗&#xff1f; - 知乎 https://www.zhihu.com/question/598494506/answer/3018702101 在学习了Spri…

Opencv实验合集——实验四:图片融合

1.概念 图像融合是将两个或多个图像结合在一起&#xff0c;创建一个新的图像的过程。这个过程的目标通常是通过合并图像的信息来获得比单个图像更全面、更有信息量的结果。图像融合可以在许多领域中应用&#xff0c;包括计算机视觉、遥感、医学图像处理等。 融合的方法有很多…

Docker 核心技术

Docker 定义&#xff1a;于 Linux 内核的 Cgroup&#xff0c;Namespace&#xff0c;以及 Union FS 等技术&#xff0c;对进程进行封装隔离&#xff0c;属于操作系统层面的虚拟化技术&#xff0c;由于隔离的进程独立于宿主和其它的隔离的进程&#xff0c;因此也称其为容器Docke…

系统设计架构——互联网案例

Netflix 的技术栈 移动和网络:Netflix 采用 Swift 和 Kotlin 来构建原生移动应用。对于其 Web 应用程序,它使用 React。 前端/服务器通信:Netflix 使用 GraphQL。 后端服务:Netflix 依赖 ZUUL、Eureka、Spring Boot 框架和其他技术。 数据库:Netflix 使用 EV 缓存、Cas…

关于“Python”的核心知识点整理大全25

目录 10.3.4 else 代码块、 10.3.5 处理 FileNotFoundError 异常 alice.py 在这个示例中&#xff0c;try代码块引发FileNotFoundError异常&#xff0c;因此Python找出与该错误匹配的 except代码块&#xff0c;并运行其中的代码。最终的结果是显示一条友好的错误消息&#x…

云计算:FusionCompute 通过 FreeNAS 添加SAN存储

目录 一、实验 1.环境准备 2.FusionCompute添加CNA 3.在存储中创建LUN资源映射给CNA节点 3.添加存储资源关联CNA主机节点 4.扫描存储资源 5.将存储设备添加为数据存储 二、问题 1.FusionCompute中存储如何分类 2.存储资源与存储设备有何区别 3.FusionCompute支持哪些…

线上环境如何正确配置 Django 的 DEBUG?

Author&#xff1a;rab Django Version&#xff1a;3.2 Python Version&#xff1a;3.9 目录 前言一、DEBUG True二、DEBUG False三、页面异常解决总结 前言 由于最近在学习 Django 的知识&#xff0c;于是尝试开发了一套 Blog 系统&#xff0c;在本地测试时是页面显示没问题…

零刻EQ12 N100 2.5G双网口 All In One新手教程

零刻EQ12 N100 2.5G双网口 All In One新手教程 前言1.硬件配置2.准备工作2.1. ESXI8.0U2镜像2.2. Rufus磁盘工具下载2.3. ikuai镜像下载2.4. StarWindConverter虚拟磁盘格式转换工具下载2.5. OpenWrt镜像下载2.6. 黑群晖RR引导镜像下载(DSM7.2)2.7. 需要准备的硬件2.8. 格式化需…

【ArcGIS微课1000例】0081:ArcGIS指北针乱码解决方案

问题描述&#xff1a; ArcGIS软件在作图模式下插入指北针&#xff0c;出现指北针乱码&#xff0c;如下图所示&#xff1a; 问题解决 下载并安装字体&#xff08;配套实验数据包0081.rar中获取&#xff09;即可解决该问题。 正常的指北针选择器&#xff1a; 专栏介绍&#xff…

【复杂网络分析与可视化】——通过CSV文件导入Gephi进行社交网络可视化

目录 一、Gephi介绍 二、导入CSV文件构建网络 三、图片输出 一、Gephi介绍 Gephi具有强大的网络分析功能&#xff0c;可以进行各种网络度量&#xff0c;如度中心性、接近中心性、介数中心性等。它还支持社区检测算法&#xff0c;可以帮助用户发现网络中的群组和社区结构。此…

设计模式——0前言目录

1 设计模式介绍 应当站在产品经理的角度来学习设计模式 是软件设计中常见问题的典型解决方案&#xff0c;可用于解决代码中反复出现的设计问题 学习效果一般的原因在于自己没有站在产品经理的角度学习&#xff0c;仅仅是为了学习怎么实现&#xff0c;用什么算法实现。 分类&…

pycharm运行正常,但命令行执行提示module不存在的多种解决方式

问题描述 在执行某个测试模块时出现提示&#xff0c;显示自定义模块data不存在&#xff0c;但是在PyCharm下运行正常。错误信息如下&#xff1a; Traceback (most recent call last):File "/run/channelnterface-autocase/testcases/test_chanel_detail.py", line 2…

JavaSE学习笔记 Day20

JavaSE学习笔记 Day20 个人整理非商业用途&#xff0c;欢迎探讨与指正&#xff01;&#xff01; 上一篇 文章目录 JavaSE学习笔记 Day20十七、数据结构与算法17.1算法17.1.1冒泡排序17.1.2选择排序17.1.3插入排序17.1.4三个排序的区别 17.2顺序表17.2.1顺序表代码实现17.2.2顺…

蜘点云原生之 KubeSphere 落地实践过程

作者&#xff1a;池晓东&#xff0c;蜘点商业网络服务有限公司技术总监&#xff0c;从事软件开发设计 10 多年&#xff0c;喜欢研究各类新技术&#xff0c;分享技术。 来源&#xff1a;本文由 11 月 25 日广州站 meetup 中讲师池晓东整理&#xff0c;整理于该活动中池老师所分享…

npm login报错:Public registration is not allowed

npm login报错:Public registration is not allowed 1.出现场景2.解决 1.出现场景 npm login登录时,出现 2.解决 将自己的npm镜像源改为npm的https://registry.npmjs.org/这个&#xff0c;解决&#xff01;

Android Studio 显示前进后退按钮

在写代码的过程中我们经常需要快速定位到先前或者往后的代码位置&#xff0c;可以使用Alt左右箭头 但是新安装的Android Studio工具栏上是没有显示左右箭头的工具按钮的&#xff0c;需要我们设置将Toolbar显示出来 View-Appearance-Toolbar 勾选即可 显示后

关于反射机制的简单理解

1、反射的简单认识 1.1 定义 Java的反射&#xff08;reflection&#xff09;机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff0c;既然能拿到,那么我…