当前位置: 首页 > news >正文

Three.js入门-模型加载

Three.js 支持多种 3D 模型格式,每种格式有其独特的优势和适用场景。根据项目的需求,选择合适的格式可以提高开发效率和用户体验。下面将详细介绍几种常见的模型格式及其特点,并补充每种格式的典型使用场景。

支持的模型类型及特点

Three.js 支持多种 3D 模型格式,以下是常见的几种类型及其特点:

1. GLTF/GLB (推荐使用)

简介:

GLTF(GL Transmission Format)是一个基于 JSON 的开放格式,而 GLB 则是其二进制版本。它被设计为传输 3D 模型和场景的标准格式,包含模型的几何信息、材质、纹理、动画等。GLTF/GLB 被广泛应用于游戏、虚拟现实、增强现实等领域,尤其适合 Web 环境。

优点:
  • 高效的加载和渲染性能:GLTF 采用了优化的文件结构,支持并行加载,提高了加载速度。GLB 格式将所有资源(如纹理、网格数据等)打包成一个文件,进一步优化了网络传输。
  • 完整的功能支持:支持纹理、材质、动画、骨骼、灯光等多种 3D 功能。GLTF 甚至支持骨骼动画,适合用来展示动态的 3D 模型。
  • 开源且广泛支持:GLTF 是一个开放标准,得到了各大 3D 软件和平台的支持,如 Sketchfab、Google 和 Microsoft 都在积极使用和推广。
缺点:
  • 相对复杂的格式:相比 OBJ 等格式,GLTF 的文件结构稍显复杂,尤其是对于不熟悉 JSON 的开发者来说,理解起来可能需要一些时间。
  • 兼容性问题:尽管支持越来越广泛,但在一些老旧浏览器或平台上,可能存在一定的兼容性问题。
适用场景:

GLTF/GLB 格式非常适合用于 Web 平台,尤其是在需要高效加载和渲染的场景下。例如:

  • Web 游戏:需要实时加载并展示大量 3D 模型时,GLTF/GLB 是理想选择。
  • 虚拟现实 (VR)增强现实 (AR):GLTF 格式能够高效加载并实时渲染大规模的 3D 场景,适合应用于 VR 和 AR 项目。
  • 3D 数据可视化:当需要展示复杂的数据集(如建筑设计、机械设计等)时,GLTF 格式可提供清晰、流畅的展示效果。

2. OBJ

简介:

OBJ 是一种较为简单的 3D 模型文件格式,通常仅包含模型的几何数据(顶点、边、面)。它不包含材质数据,通常需要与 MTL 文件一起使用,以定义材质属性。OBJ 格式历史悠久,兼容性好,广泛应用于多种 3D 软件。

优点:
  • 简单易用:OBJ 文件格式结构简单,易于理解和解析。它是 3D 模型中最基本的格式之一,适合初学者。
  • 广泛兼容:OBJ 被大多数 3D 软件支持,包括 Blender、Maya、3ds Max 等,适用于多种工作流。
缺点:
  • 加载效率较低:OBJ 文件通常比 GLTF 更大,且加载时可能需要解析多个文件(例如材质文件),导致加载速度较慢。
  • 功能有限:OBJ 只支持基本的几何数据,无法支持动画、骨骼或复杂的材质效果。
适用场景:

OBJ 格式适合用于静态模型的展示,尤其是在对加载性能要求不高、且不需要动画和复杂材质的项目中。例如:

  • 静态展示:适用于展示物体模型、建筑模型等静态对象。
  • 3D 打印:OBJ 格式通常是 3D 打印中的标准格式,适用于原型制作和设计验证。

3. FBX

简介:

FBX(Filmbox)格式是由 Autodesk 开发的专有格式,广泛用于动画和视频游戏的制作中。FBX 支持骨骼、动画、材质和纹理等多种特性,适用于复杂的 3D 模型和动画数据交换。

优点:
  • 支持复杂动画和骨骼系统:FBX 格式特别适合用于存储和传输复杂的动画数据和骨骼系统。它可以包含多个动画、骨骼权重和变形数据,适合用于角色动画、动作捕捉等复杂场景。
  • 良好的兼容性:FBX 格式被多个 3D 软件广泛支持,包括 Autodesk 旗下的软件,如 Maya 和 3ds Max。
缺点:
  • 文件体积大,加载慢:FBX 格式相对较大,加载时需要较多的内存和 CPU 计算,因此在 Web 环境下加载速度较慢。
  • 解析复杂,兼容性问题:FBX 格式的解析相对复杂,可能会在不同平台或版本之间存在兼容性问题。
适用场景:

FBX 格式适合用于需要复杂动画和骨骼系统的 3D 项目,尤其是在游戏开发、影视动画等领域,常用于角色动画、场景动画的制作。例如:

  • 游戏开发:FBX 格式可以包含角色动画、环境动画等,适用于动态游戏场景。
  • 影视动画制作:FBX 格式能够高效支持复杂的骨骼动画,适合用于角色动画和场景动画的制作。

4. STL

简介:

STL(STereoLithography)格式是一种广泛用于 3D 打印的文件格式,主要存储三维模型的几何数据(顶点和法线)。STL 格式通常不支持材质、纹理或动画,主要用于静态物体的表示。

优点:
  • 简单直观:STL 格式简单,易于生成和解析,适合用于 3D 打印和原型开发。
  • 广泛应用:STL 是 3D 打印领域的标准格式,广泛应用于工业设计和制造业。
缺点:
  • 不支持材质和纹理:STL 文件不支持材质和纹理,不能用于真实感渲染。
  • 不支持动画:STL 格式只适用于静态物体,无法存储动画或其他动态效果。
适用场景:

STL 格式非常适合用于 3D 打印、原型设计和工程设计,但不适合用于 Web 渲染或游戏开发。例如:

  • 3D 打印:STL 格式是 3D 打印机接受的标准格式,广泛应用于制造业和原型设计。
  • 工业设计:STL 格式适用于设计产品原型、测试零件的物理性能等。

5. Collada (.dae)

简介:

Collada 是一个基于 XML 的开放文件格式,主要用于交换 3D 数据,支持动画、物理模拟等特性。它被多个 3D 软件广泛支持,如 Blender、Maya、3ds Max 等。

优点:
  • 支持动画和物理模拟:Collada 格式能够存储模型的动画、物理属性和材质信息,适合用于更复杂的 3D 场景。
  • 开放标准,广泛支持:Collada 是一个开放标准,支持多种 3D 工具和引擎,适合进行多平台数据交换。
缺点:
  • 文件体积较大:Collada 文件通常较大,尤其是在存储大量动画和物理信息时,加载时可能会比较缓慢。
  • 性能较差:相比 GLTF,Collada 格式的加载性能较差,尤其在 Web 上表现不如预期。
适用场景:

Collada 格式适用于需要存储动画、物理模拟和材质的复杂项目,但在 Web 环境中使用时需要注意加载性能问题。例如:

  • 跨平台数据交换:Collada 适用于不同平台、软件间的数据交换,常用于多引擎开发场景。
  • 动画与物理模拟:在需要精细控制动画和物理模拟效果的场景下,Collada 格式可以提供更多的灵活性。

如何导入模型

准备模型文件

需要准备一个 GLTF 或 GLB 模型文件。可以从 Sketchfab(https://sketchfab.com) 或其他模型资源网站下载。

Sketchfab 是一个全球领先的 3D 内容平台,允许用户上传、展示和分享 3D 模型。支持多种文件格式,如 GLTF、GLB、FBX、OBJ、STL 等,用户可以在浏览器中实时查看并交互式浏览模型。Sketchfab 提供 VR 和 AR 支持,增强了沉浸式体验。此外,用户可以将模型嵌入网站或社交媒体,便于分享。平台还拥有一个市场,用户可以购买或出售 3D 模型,广泛应用于游戏开发、3D 打印、虚拟展览等场景。通过数据分析功能,用户可以跟踪模型的浏览量和互动情况。总之,Sketchfab 是一个便捷的 3D 模型展示和交易平台,适合艺术家、设计师、开发者等各类创作者使用。

这次我们案例模型地址:https://sketchfab.com/3d-models/car-acccd15d4e454399a39dbe40f4f6df71

在这里插入图片描述

创建基础场景

import * as THREE from "three";// 创建场景
const scene = new THREE.Scene();// 创建相机
const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000
);
camera.position.set(0, 1, 3);// 创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);// 添加光源
const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(5, 5, 5);
scene.add(light);// 渲染循环
function animate() {requestAnimationFrame(animate);renderer.render(scene, camera);
}
animate();

运行以上代码后,你会看到一个空白的 3D 场景。

加载 GLTF/GLB 模型

1. 安装 GLTFLoader

Three.js 提供了很多加载器,其中 GLTFLoader 用于加载 .gltf.glb 格式的模型。

引入 GLTFLoader

import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js";
2. 使用 GLTFLoader 加载模型
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";// 创建加载器
const loader = new GLTFLoader();// 加载模型
loader.load("/car/scene.gltf", // 模型路径(gltf) => {// 加载成功回调const model = gltf.scene;scene.add(model);},(xhr) => {// 加载进度回调console.log(`模型加载进度:${(xhr.loaded / xhr.total) * 100}%`);},(error) => {// 加载错误回调console.error("模型加载出错:", error);}
);
3. 调整模型位置和大小

加载的模型可能位置不对或太大/太小。可以对其进行调整:

model.position.set(0, 0, 0); // 设置模型位置
model.scale.set(0.5, 0.5, 0.5); // 缩放模型大小

到此,我们模型就引入成功了。
在这里插入图片描述

小结

在选择模型格式时,推荐首选 GLTF/GLB 格式,尤其是在 Web 项目中。它具有良好的加载性能、支持复杂的 3D 特性,并且有广泛的社区支持。其他格式如 OBJ、FBX 和 STL,虽然在特定场景下有独特的优势,但往往不如 GLTF/GLB 在 Web 中高效实用。希望通过本部分内容的介绍,能够帮助你更好地理解每种模型格式的特点和适用场景,做出最合适的选择。

相关文章:

Three.js入门-模型加载

Three.js 支持多种 3D 模型格式,每种格式有其独特的优势和适用场景。根据项目的需求,选择合适的格式可以提高开发效率和用户体验。下面将详细介绍几种常见的模型格式及其特点,并补充每种格式的典型使用场景。 支持的模型类型及特点 Three.j…...

ECharts实现数据可视化入门详解

文章目录 ECharts实现数据可视化入门详解一、引言二、基础配置1.1、代码示例 三、动态数据与交互2.1、代码示例 四、高级用法1、多图表组合1.1、在同一容器中绘制多个图表1.2、创建多个容器并分别初始化 ECharts 实例1.3、实现多图联动 五、总结 ECharts实现数据可视化入门详解…...

C++(举例说明类的实例化方式)

太多的信息会让你抓不住重点,下面通过间短的举例说明了类的几种实例化方式,熟悉以后再阅读代码的时候就能减少疑惑。 1.直接实例化:使用类名直接实例化对象 MyClass obj; 2.使用 new 关键字动态分配内存:使用 new 关键字来在堆上…...

LeetCode32. 最长有效括号(2024冬季每日一题 32)

给你一个只包含 ( 和 ) 的字符串,找出最长有效(格式正确且连续)括号子串的长度。 示例 1: 输入:s “(()” 输出:2 解释:最长有效括号子串是 “()” 示例 2: 输入:s “…...

Textfocals ——基于大言模型的用户驱动型文本改进工具让用户在审阅自己的写作时对其进行修改

概述 论文地址:https://arxiv.org/abs/2403.01055 大规模语言模型可以生成媲美专业作家撰写的文本。目前使用的对话技术主要有两种:一种是交互式(如 OpenAI 的 ChatGPT 和 Google 的 Gemini),另一种是预测性文本补全&…...

docker 部署 redis

docker 部署 redis 1. 下载 redis 镜像 # docker images | grep redis bitnami/redis 7.2.4-debian-11-r5 45de196aef7e 10 months ago 95.2MB2. docker-compose 部署 version: "3" services:redis:image: bitnami/redis:7.2.4-debian-11-…...

微信小程序横屏页面跳转后,自定义navbar样式跑了?

文章目录 问题原因:解决方案: 今天刚遇到的问题,横屏的页面完成操作后跳转页面后,自定义的tabbar样式乱了,跑到最顶了,真机调试后发现navbar跑到手机状态栏了,它正常应该跟右边胶囊一行。 知道问…...

回归预测 | MATLAB实现BiGRU(双向门控循环单元)多输入单输出

回归预测 | MATLAB实现BiGRU(双向门控循环单元)多输入单输出 文章目录 回归预测 | MATLAB实现BiGRU(双向门控循环单元)多输入单输出预测效果基本介绍程序设计参考资料致谢预测效果 基本介绍 BiGRU(双向门控循环单元)多输入单输出模型是一种结合了双向门控循环单元(BiGRU)的…...

智能时代的基石:神经网络

智能时代的基石:神经网络 第一节:神经网络简介 课程目标 本节课程旨在全面介绍神经网络的基本概念、结构以及其在历史发展中的重要里程碑。通过深入理解神经网络的工作原理和演变过程,学员将能够掌握神经网络在现实世界中的多种应用&#…...

红与黑,,

有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。 你站在其中一块黑色的瓷砖上,只能向相邻(上下左右四个方向)的黑色瓷砖移动。 请写一个程序,计算你总共能够到达多少块黑色的瓷砖。 输入格式 输入包…...

嵌入式驱动开发详解16(音频驱动开发)

文章目录 前言WM8960简介I2S协议接口说明 SAI音频接口简介驱动框架简介设备树配置内核使能声卡设置与测试 后续参考文献 前言 该专栏主要是讲解嵌入式相关的驱动开发,但是由于ALSA驱动框架过于复杂,实现音频编解码芯片的驱动不是一个人能完成的&#xf…...

【嵌入式软件】跑开发板的前置服务配置

在嵌入式开发中,通常需要在 开发板和主机之间共享、传输和挂载文件。 这篇文章是关于如何在 Ubuntu 中配置 Samba、TFTP 和 NFS 协议的详细步骤。这些协议分别用于远程文件共享、文件传输和内核挂载文件系统。 如何安装协议: 参考:ubuntu18配置:详细的内容我手写了一份文档。…...

如何高效实现进程间通信

实现进程间通信(IPC)有多种高效的方法,以下是一些常见的技术及其简要说明: 1. 共享内存: 共享内存是一种高效的进程间通信机制,允许多个进程共享同一块内存区域以实现快速的数据交换。与其他IPC机制相比&a…...

scala基础学习_变量

文章目录 scala中的变量常量 val(不可变变量)变量 var变量声明多变量声明匿名变量 _ 声明 变量类型声明变量命名规范 scala中的变量 常量 val(不可变变量) 使用val关键字声明变量是不可变的,一旦赋值后不能被修改 对…...

Java 身份证校验工具类(15位校验、18位校验与15转18)

文章目录 身份证简介(一)身份证号码的组成(二)一代和二代身份证一代身份证二代身份证 检验思路分析(一)15位身份证号码(二)18位身份证号码(三)校验算法示例&a…...

HTML+CSS+Vue3的静态网页,免费开源,可当作作业使用

拿走请吱一声&#xff0c;点个关注吧&#xff0c;代码如下&#xff0c;网页有移动端适配 HTML <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width…...

【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(8)

1.问题描述&#xff1a; 在AGC中&#xff0c;推送服务的消息回执新建成功后&#xff0c;有一个有效期 1&#xff0c;这个有效期是什么意思&#xff0c;过期后&#xff0c;会影响什么呢&#xff1f; 2&#xff0c;这个有效期是否可以修改成一直不过期&#xff1f; 解决方案&…...

HCIA-Access V2.5_2_2_2网络通信基础_IP编址与路由

网络层数据封装 首先IP地址封装在网络层&#xff0c;它用于标识一台网络设备&#xff0c;其中IP地址分为两个部分&#xff0c;网络地址和主机地址&#xff0c;通过我们采用点分十进制的形式进行表示。 IP地址分类 对IP地址而言&#xff0c;它细分为五类&#xff0c;A,B,C,D,E,…...

音频客观测评方法PESQ

一、简介 语音质量感知评估&#xff08;Perceptual Evaluation of Speech Quality&#xff09;是一系列的标准&#xff0c;包括一种用于自动评估电话系统用户所体验到的语音质量的测试方法。该标准于2001年被确定为ITU-T P.862建议书[1]。PESQ被电话制造商、网络设备供应商和电…...

前后端分离的项目使用nginx 解决 Invalid CORS request

我是这样打算的&#xff0c;前端用nginx代理&#xff0c;使用80 转443 端口走https 前端的地址就是http://yumbo.top 或https://yumbo.top 后端服务地址是&#xff1a;http://yumbo.top:8081 下面是我的完整配置&#xff0c;功能是正常的&#xff0c;加了注释 user nginx; …...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

webpack面试题

面试题&#xff1a;webpack介绍和简单使用 一、webpack&#xff08;模块化打包工具&#xff09;1. webpack是把项目当作一个整体&#xff0c;通过给定的一个主文件&#xff0c;webpack将从这个主文件开始找到你项目当中的所有依赖文件&#xff0c;使用loaders来处理它们&#x…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版

1.题目描述 2.思路 当前的元素可以重复使用。 &#xff08;1&#xff09;确定回溯算法函数的参数和返回值&#xff08;一般是void类型&#xff09; &#xff08;2&#xff09;因为是用递归实现的&#xff0c;所以我们要确定终止条件 &#xff08;3&#xff09;单层搜索逻辑 二…...

工厂方法模式和抽象工厂方法模式的battle

1.案例直接上手 在这个案例里面&#xff0c;我们会实现这个普通的工厂方法&#xff0c;并且对比这个普通工厂方法和我们直接创建对象的差别在哪里&#xff0c;为什么需要一个工厂&#xff1a; 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类&#xff1a; 两个发…...