Three.js 实现导出模型文件(.glb,.gltf)功能 GLTFExporter

2023-09-21 10:18:12

Three.js提供了导出(.glb,.gltf)文件的API GLTFExporter 用于实现场景内容导出模型文件的功能

导出模型文件主要使用 parse 方法,该方法接收三个参数:

1.scene:要导出的场景对象。
2.onComplete:解析完成后的回调函数,接收一个参数 result,表示解析后的 glTF 数据。
3.options:可选参数,用于配置导出的选项。

下面是options的一些常用参数选项:

1.binary:布尔值,指定是否将 glTF 导出为二进制格式。默认为 false。
2.truncationDecimalDigits:整数值,指定在导出过程中截断浮点数的小数位数。默认为 null,表示不截断。
3.forceIndices:布尔值,指定是否强制导出索引。默认为 false。
4.forcePowerOfTwoTextures:布尔值,指定是否强制将纹理的尺寸调整为 2 的幂次方。默认为 false。
5.onlyVisible:布尔值,指定是否只导出可见的对象。默认为 false。
6.onlySelected:布尔值,指定是否只导出选中的对象。默认为 false。
7.embedImages:布尔值,指定是否将纹理嵌入到 glTF 文件中。默认为 false。
8.animations:数组 导出动画的剪辑列表 。默认为 []
9.trs: 布尔值, 是否保留位置、旋转、缩放信息 。默认为 false

GLTFExporter 还提供了其他一些方法和属性,用于处理 glTF 数据的导出过程。下面是一些常用的方法和属性:

parse:将场景对象解析为 glTF 数据。
parseNode:解析场景中的节点。
parseMesh:解析场景中的网格。
parseCamera:解析场景中的相机。
parseLight:解析场景中的灯光。
parseMaterial:解析场景中的材质。
parseTexture:解析场景中的纹理。
parseAnimation:解析场景中的动画。
parseSkin:解析场景中的皮肤。
parseAccessor:解析场景中的访问器。
parseBuffer:解析场景中的缓冲区。
parseBufferView:解析场景中的缓冲区视图。
parseImage:解析场景中的图像。
parseSampler:解析场景中的采样器。
parseScene:解析场景。
parseScenes:解析场景列表。
parseAnimations:解析动画列表。
parseMaterials:解析材质列表。
parseTextures:解析纹理列表。
parseImages:解析图像列表。
parseSamplers:解析采样器列表。
parseAccessors:解析访问器列表。
parseBuffers:解析缓冲区列表。
parseBufferViews:解析缓冲区视图列表。
parseSkins:解析皮肤列表。

在上一篇 Three.js加载外部glb,fbx,gltf,obj 模型文件 的文章基础上新增一个 onExporterModel(导出模型方法)
引入导出API GLTFExporter

import { GLTFExporter } from 'three/examples/jsm/exporters/GLTFExporter.js'
	// 导出模型
	onExporterModel(type) {
		const exporter = new GLTFExporter();
		const options = {
	        trs: true,      // 是否保留位置、旋转、缩放信息
			animations: this.modelAnimation, // 导出的动画
			binary: type == 'glb' ? true : false,  // 是否以二进制格式输出
			embedImages: true,//是否嵌入贴图
			onlyVisible: true, //是否只导出可见物体
			forcePowerOfTwoTextures: true,
			includeCustomMaterials: true, //指定是否包含自定义材质
			includeCustomAttributes: true, //	指定是否包含自定义属性
			includeCustomTextures: true, //	指定是否包含自定义纹理
			includeCustomSamplers: true, //	指定是否包含自定义采样器
			includeCustomImages: true, //	指定是否包含自定义图像
			includeCustomTechniques: true, //	指定是否包含自定义技术
			includeCustomMaterialsCommon: true, //指定是否包含自定义 MaterialsCommon
			includeCustomMeshes: true,//指定是否包含自定义网格
			includeCustomSkins: true, //指定是否包含自定义皮肤
			includeCustomNodes: true, // 指定是否包含自定义节点
			includeCustomGeometries: true, //指定是否包含自定义几何体
			includeCustomPrograms: true, // 指定是否包含自定义程序
			includeCustomShaders: true, //指定是否包含自定义着色器
			includeCustomExtensions: true, //指定是否包含自定义扩展。如果设置为true,则会包含在导出中定义的自定义GLTF扩展
		}
		exporter.parse(this.scene, function (result) {
			console.log(result)
			if (result instanceof ArrayBuffer) {
				// 将结果保存为GLB二进制文件
				saveArrayBuffer(result, `${new Date().toLocaleString()}.glb`);
·			} else {
				// 将结果保存为GLTF JSON文件
				saveString(JSON.stringify(result), `${new Date().toLocaleString()}.gltf`);
			}
			function saveArrayBuffer(buffer, filename) {
				// 将二进制数据保存为文件
				const blob = new Blob([buffer], { type: 'application/octet-stream' });
				const url = URL.createObjectURL(blob);
				const link = document.createElement('a');
				link.href = url;
				link.download = filename;
				link.click();
				URL.revokeObjectURL(url);
				ElMessage.success('导出成功')
			}
			function saveString(text, filename) {
				// 将字符串数据保存为文件
				const blob = new Blob([text], { type: 'application/json' });
				const url = URL.createObjectURL(blob);
				const link = document.createElement('a');
				link.href = url;
				link.download = filename;
				link.click();
				URL.revokeObjectURL(url);
				ElMessage.success('导出成功')
			}
		}, (err) => {
			ElMessage.error(err)
		}, options);
	}

完整的代码可参考:https://gitee.com/ZHANG_6666/Three.js3D

界面效果:
在这里插入图片描述

更多推荐

【Linux网络编程】Socket-TCP实例

该代码利用socket套接字建立Tcp连接,包含服务器和客户端。当服务器和客户端启动时需要把端口号或ip地址以命令行参数的形式传入。服务器启动如果接受到客户端发来的请求连接,accept函数会返回一个打开的socket文件描述符,区别于监听连接的listensock,它用来为客户端提供服务的。因为有线程池的存在,可以立

Linux设备驱动模型之platform设备

Linux设备驱动模型之platform设备上一章节介绍了Linux字符设备驱动,它是比较基础的,让大家理解Linux内核的设备驱动是如何注册、使用的。但在工作中,个人认为完全手写一个字符设备驱动的机会比较少,更多的都是基于前人的代码修修补补过三年。在内核驱动中,你会看到比较多的platform相关的字样,他们具体是什

涨知识,关于代码签名证书10大常见问题解答

在当今互联网+时代,各种软件程序充斥着这个网络世界,大大小小的软件层出不穷,如何让用户信任软件并下载软件,是众多软件开发公司需要解决的问题,由此代码签名证书应运而生,提供了软件程序的身份认证、完整性和可信任性的解决方案。那么什么是代码签名证书?代码签名证书的原理是什么?锐成小编收集整理了关于代码签名证书10大常见问题解

PostgreSQL的主从复制方式

主从复制方式PostgreSQL支持多种主从复制(Master-SlaveReplication)方式,用于创建可靠的数据备份和故障容错解决方案。以下是几种常见的主从复制方式:同步复制(SynchronousReplication):在同步复制中,主节点将事务发送到一个或多个从节点,并等待从节点确认写操作已成功应用。只

AIGC驱动产品开发创新,改变你所知的一切!

你是否想过,3000年后的饮料是什么味道?9月12日,可口可乐全球创意平台“乐创无界”再度推出全新限定产品——首款联合人工智能(AI)打造的无糖可口可乐“未来3000年”。从口味研发到包装设计都体现了AI的深度参与打造。Y3000与AI共创这一举措,也呼应了平台以潮流创新的产品与沉浸式体验链接年轻消费者的理念,赋予可口

多因素身份验证MFA功能

随着信息技术的不断进步,网络威胁也随之不断升级和演化。为了保护敏感数据和网络资源,企业和组织需要采取更多的安全措施强化信息安全。多因素身份验证(MFA)已经成为了现代安全战略的核心组成部分之一。在这篇文章中,我们将深入探讨ADSelfServicePlus产品内置的多因素身份验证(MFA)功能,以及如何利用ADSelf

Jmeter对图片验证码的处理

​jmeter对图片验证码的处理在web端的登录接口经常会有图片验证码的输入,而且每次登录时图片验证码都是随机的;当通过jmeter做接口登录的时候要对图片验证码进行识别出图片中的字段,然后再登录接口中使用;通过jmeter对图片验证码的识别方法1、通过ocrserver工具识别图片验证码;如下图:解压后双击OcrSe

自动直播软件开发方案:打造智能化、高效化的直播体验

一、引言随着社交媒体和互联网的快速发展,直播已经成为了人们互动和传播的重要方式。然而,传统直播存在着人力成本高、内容质量不稳定等问题,因此,开发一款自动直软件成为了解决这些问题的关键。二、市场需求分析1.直播行业的快速增长:直播行业在近年来呈现出爆发式增长的趋势,用户对高质量、多样化的直播内容的需求日益增长。2.直播内

服务器的维护是如何操作的

服务器的维护是如何操作的服务器可以说是不可或缺的资源,因为现在网络技术发达,我们的生活也都离不开网络的存在,我们想要获取的业务、资料等大多是通过网络进行,所以想要顺应潮流并获得发展,肯定需要服务器来将企业的相关信息与产品等发布到网络中,供客户选择。那应该如何维护好服务器呢?硬件维护1、增加内存和硬盘容量的工作。增加内存

转行车载做开发,首先得掌握好Android Framework~

前言在当今社会,科技的快速发展推动了各行各业的变革。移动设备作为人们生活、工作、学习的重要工具,其市场份额逐年攀升。Android作为全球最受欢迎的移动操作系统之一,为开发者提供了广阔的发展空间。但是现在Android发展比较尴尬,之前想吃它红利的人群太多,加快了行业内卷的部分,致使现在Android人才市场饱,甚至可

压电换能器的工作原理和应用(功率放大器)

在日常生活中,可能会遇到很难测量的物理量,例如施加在金属上的机械应力、温度、压力水平等……对于所有这些应用,需要一种能够以我们熟悉的单位和校准来测量这些未知量的设备,而比较常用的设备是换能器。换能器是一种电气设备,可以将任何类型的物理量以成比例的电量形式转换为电压或电流。按照使用材电磁特性来划分,换能器主要有磁致伸缩和

热文推荐