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驱动框架过于复杂,实现音频编解码芯片的驱动不是一个人能完成的…...

【嵌入式软件】跑开发板的前置服务配置
在嵌入式开发中,通常需要在 开发板和主机之间共享、传输和挂载文件。 这篇文章是关于如何在 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的静态网页,免费开源,可当作作业使用
拿走请吱一声,点个关注吧,代码如下,网页有移动端适配 HTML <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width…...
【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(8)
1.问题描述: 在AGC中,推送服务的消息回执新建成功后,有一个有效期 1,这个有效期是什么意思,过期后,会影响什么呢? 2,这个有效期是否可以修改成一直不过期? 解决方案&…...

HCIA-Access V2.5_2_2_2网络通信基础_IP编址与路由
网络层数据封装 首先IP地址封装在网络层,它用于标识一台网络设备,其中IP地址分为两个部分,网络地址和主机地址,通过我们采用点分十进制的形式进行表示。 IP地址分类 对IP地址而言,它细分为五类,A,B,C,D,E,…...

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

前后端分离的项目使用nginx 解决 Invalid CORS request
我是这样打算的,前端用nginx代理,使用80 转443 端口走https 前端的地址就是http://yumbo.top 或https://yumbo.top 后端服务地址是:http://yumbo.top:8081 下面是我的完整配置,功能是正常的,加了注释 user nginx; …...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...