史上最详细的在three.js导出gltf,glb,obj,stl格式的模型文件

史上最详细的在three.js导出gltf,glb,obj,stl格式的模型文件

前言

关于实现这个功能,Three 中提供了 GLTFExporterOBJExporter 导出器。

但是这两个类的使用方法,跟你的Three版本有很大的关系。不同的版本,实现方式是不一样的,代码上会有区别。所以,继续往下看时,请务必先确认你当前的Three版本。

【更新】2025-03-18:请把你的three.js版本打在评论里。

GLTF

import * as THREE from 'three';

// 下面这个导入的路径看你的文件路径关系,不要搞错了(我这里是使用第一种)
import { GLTFExporter } from 'three/examples/jsm/exporters/GLTFExporter.js';
// import { GLTFExporter } from 'three/addons/exporters/GLTFExporter.js';

// 创建你的模型
let myModel = new THREE.Mesh(
	new THREE.SphereGeometry(20, 10, 10),
    new THREE.MeshStandardMaterial({
		color: 0xffff00,
	    metalness: 0.5,
	    roughness: 1.0,
	    flatShading: true
	})
);
myModel.position.set( 0, 0, 0 );
myModel.name = 'my-Sphere';
scene.add(myModel)

// 导出器
const exporter = new GLTFExporter();
// 配置选项(可选)
const options = {
  binary: false,       // 导出为 .gltf
  trs: false,         // 不使用位移/旋转/缩放节点
  onlyVisible: true,  // 仅导出可见对象
  includeCustomExtensions: true
};
 // 执行导出
exporter.parse(myModel, (result) => {
	const output = JSON.stringify( result, null, 2 );
	// 保存文件
	const blob = new Blob([output], { type: 'text/plain' });
    const link = document.createElement('a');
    link.href = URL.createObjectURL(blob);
    link.download = 'mymodel.gltf';
    link.click();
}, (error) => {
	console.log( 'An error happened during parsing', error );
}, options);

【需要注意的是】这里的 exporter.parse() 方法,接受4个参数。不要错了!

glb

import * as THREE from 'three';

// 下面这个导入的路径看你的文件路径关系,不要搞错了(我这里是使用第一种)
import { GLTFExporter } from 'three/examples/jsm/exporters/GLTFExporter.js';
// import { GLTFExporter } from 'three/addons/exporters/GLTFExporter.js';

// 创建你的模型
let myModel = new THREE.Mesh(
	new THREE.SphereGeometry(20, 10, 10),
    new THREE.MeshStandardMaterial({
		color: 0xffff00,
	    metalness: 0.5,
	    roughness: 1.0,
	    flatShading: true
	})
);
myModel.position.set( 0, 0, 0 );
myModel.name = 'my-Sphere';
scene.add(myModel)

const exporter = new GLTFExporter();
// 配置选项(可选)
const options = {
  binary: true,       // 导出为 .glb
  trs: false,         // 不使用位移/旋转/缩放节点
  onlyVisible: true,  // 仅导出可见对象
  includeCustomExtensions: true
};
 // 执行导出
exporter.parse(myModel, (result) => {
	// 这里用 type: 'model/gltf-binary' , 或者 type: 'application/octet-stream' 都是可以的,问题不大。(关于这两者更详细的解释说明,我放到了文章最后)
	const blob = new Blob([result], { type: 'model/gltf-binary' });
    const link = document.createElement('a');
    link.href = URL.createObjectURL(blob);
    link.download = 'mymodel.glb';
    link.click();
}, (error) => {
	console.log( 'An error happened during parsing', error );
}, options);

可以使用一套公用代码来生成 glb / gltf:

import * as THREE from 'three';

// 下面这个导入的路径看你的文件路径关系,不要搞错了(我这里是使用第一种)
import { GLTFExporter } from 'three/examples/jsm/exporters/GLTFExporter.js';
// import { GLTFExporter } from 'three/addons/exporters/GLTFExporter.js';

// 创建你的模型
let myModel = new THREE.Mesh(
	new THREE.SphereGeometry(20, 10, 10),
    new THREE.MeshStandardMaterial({
		color: 0xffff00,
	    metalness: 0.5,
	    roughness: 1.0,
	    flatShading: true
	})
);
myModel.position.set( 0, 0, 0 );
myModel.name = 'my-Sphere';
scene.add(myModel)

let param = {
  binary: true
}

const exporter = new GLTFExporter();
// 配置选项(可选)
const options = {
  binary: param.binary,       // 导出为 .glb 或 .gltf
  trs: false,         // 不使用位移/旋转/缩放节点
  onlyVisible: true,  // 仅导出可见对象
  includeCustomExtensions: true
};
 // 执行导出
exporter.parse(myModel, (result) => {
	if ( result instanceof ArrayBuffer ) {
		const blob = new Blob( [ result ], { type: 'model/gltf-binary' } );
		const link = document.createElement('a');
	    link.href = URL.createObjectURL(blob);
	    link.download = 'mymodel.glb';
	    link.click();
	} else {
		const output = JSON.stringify( result, null, 2 );
		const blob = new Blob( [ output ], { type: 'text/plain' } );
		const link = document.createElement('a');
	    link.href = URL.createObjectURL(blob);
	    link.download = 'mymodel.gltf';
	    link.click();
	}
}, (error) => {
	console.log( 'An error happened during parsing', error );
}, options);

【需要注意的是】这里的 exporter.parse() 方法,接受4个参数。不要错了!

obj

import * as THREE from 'three';

// 下面这个导入的路径看你的文件路径关系,不要搞错了(我这里是使用第一种)
import { OBJExporter } from 'three/examples/jsm/exporters/OBJExporter.js';
import { OBJExporter } from 'three/addons/exporters/OBJExporter.js';

// 创建你的模型
let myModel = new THREE.Mesh(
	new THREE.SphereGeometry(20, 10, 10),
    new THREE.MeshStandardMaterial({
		color: 0xffff00,
	    metalness: 0.5,
	    roughness: 1.0,
	    flatShading: true
	})
);
myModel.position.set( 0, 0, 0 );
myModel.name = 'my-Sphere';
scene.add(myModel)

const exporter = new OBJExporter();
const result = exporter.parse(myModel); // 直接返回字符串
// 保存文件
const blob = new Blob([result], { type: 'text/plain' });
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = 'mymodel.obj';
link.click();

STL

import * as THREE from 'three';

// 下面这个导入的路径看你的文件路径关系,不要搞错了(我这里是使用第一种)
import { STLExporter } from 'three/examples/jsm/exporters/STLExporter.js';
import { STLExporter } from 'three/addons/exporters/STLExporter.js';

// 创建你的模型
let myModel = new THREE.Mesh(
	new THREE.SphereGeometry(20, 10, 10),
    new THREE.MeshStandardMaterial({
		color: 0xffff00,
	    metalness: 0.5,
	    roughness: 1.0,
	    flatShading: true
	})
);
const exporter = new STLExporter();
const result = exporter.parse(myModel , { binary: true }); // 导出二进制格式

const blob = new Blob([result], { type: 'application/octet-stream' });
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = 'mymodel.stl';
link.click();

写在最后

1、关于下载 glb 文件时,type 用 model/gltf-binary 还是 application/octet-stream 的说明:

  • application/octet-stream‌ 表示通用的二进制流数据,适用于所有未知或未注册的二进制文件‌。适用场景‌:无特定格式要求时使用,浏览器不会尝试解析文件内容,直接触发下载‌。‌
  • model/gltf-binary‌:根据 Khronos Group 对 GLB 格式的规范,.glb 的官方 MIME 类型为 model/gltf-binary,明确标识文件为二进制格式的 glTF 数据‌。部分工具或框架(如 Babylon.js、A-Frame)会根据此类型自动识别文件格式,提升兼容性‌。

2、Three.js 官网示例选择 application/octet-stream 的原因:

  • 跨版本兼容性‌
    Three.js 早期版本未强制要求严格符合 GLB 规范,使用通用类型可避免因 MIME 类型限制导致的下载失败‌。

  • 简化代码逻辑‌
    官网示例以功能实现为目标,application/octet-stream 能直接兼容所有场景,无需考虑外部工具对 MIME 类型的依赖‌。

3、建议选择 model/gltf-binary 的场景:

  • 与其他工具集成时‌
    若导出的 .glb 文件需要导入到 Unity、Blender 或 Web 3D 框架中,使用规范类型可避免解析错误‌。
  • 遵循最新规范时‌
    2023 年后,主流 3D 工具已普遍支持 model/gltf-binary 类型,符合行业标准‌。

—————————— 【正文完】——————————

前端学习交流群,想进来面基的,可以加Q群: 832485817685486827

写在最后: 约定优于配置 —— 软件开发的简约原则

——————————【完】——————————

我的:
个人网站: https://neveryu.github.io/neveryu/
Github: https://github.com/Neveryu
微信: 421354532

更多学习资源请关注我的微信…好吗

1. Ply格式的mesh Ply格式是一种通用的3D模型文件格式,可以存储点云、网格和曲面等各种类型的3D数据。Ply文件通常包含顶点信息、面信息、法线信息、纹理坐标信息和颜色信息等。Ply文件可以通过Ply解析器来加载和处理。 2. STL格式的mesh STL格式是一种简单的3D模型文件格式,通常用于存储三角形网格数据。STL文件包含了每个三角形的三个顶点坐标和法线向量信息。STL文件可以通过STL解析器来加载和处理。 3. OBJ格式的mesh OBJ格式是一种通用的3D模型文件格式,它可以存储多边形网格、曲面和点云等各种类型的3D数据。OBJ文件通常包含顶点信息、面信息、纹理坐标信息和法线信息等。OBJ文件可以通过OBJ解析器来加载和处理。 4. OFF格式的mesh OFF格式是一种简单的3D模型文件格式,通常用于存储多边形网格数据。OFF文件包含了每个顶点的坐标信息和每个面的顶点索引信息。OFF文件可以通过OFF解析器来加载和处理。 5. glTF格式的mesh glTF格式是一种新兴的3D模型文件格式,它使用JSON作为数据格式,可以存储多种类型的3D数据,例如网格、材质、动画和场景等。glTF文件可以通过glTF解析器来加载和处理。 6. glb格式的mesh glb格式是一种二进制的glTF格式,它将glTF文件打包成一个二进制文件,可以更快地加载和渲染3D模型glb文件可以通过glTF解析器来加载和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值