【基础】Three.js加载纹理贴图、加载外部gltf格式文件
1. 模型使用纹理贴图
const geometry = new THREE.BoxGeometry(10, 10, 10);const textureLoader = new THREE.TextureLoader(); // 创建纹理贴图加载器const texture = textureLoader.load("/crate.gif"); // 加载纹理贴图const material = new THREE.MeshLambertMaterial({map: texture,side: THREE.DoubleSide, //两面可见});
2. 加载外部gltf格式
GLTF(GL Transmission Format)
是一种高效、开放的3D文件格式,专为Web和移动端实时渲染而设计。GLTF文件格式旨在传输3D模型数据,具有快速加载、渲染效率高、支持丰富的材质和动画等优点,被称为“3D领域的JPEG”。
GLTF文件结构:
.gltf(JSON文件)
: 描述模型的主要结构,包括几何体、材质、动画、场景等。
.bin(二进制文件)
: 存储顶点数据、法线、UV坐标等二进制数据。
纹理(.png, .jpg): 存储模型使用的纹理贴图。
.glb(单文件格式)
: GLB是GLTF的二进制版本,将所有数据(JSON、二进制和纹理)合并到一个文件中,方便传输和使用。
可以用Blender软件导出绘制好的三维模型,也可以打开和预览gltf格式文件模型。
注意: 纹理贴图和gltf格式存放在public
目录下
// 创建GLTFLoader实例const loader = new GLTFLoader();// 加载.gltf文件loader.load("/models/Parrot.glb", function (gltf) {const model = gltf.scene;// 修改模型的位置model.position.set(0, 15, 0); // 设置为(x, y, z),可根据需要调整// 修改模型的旋转model.rotation.set(Math.PI / 4, Math.PI / 4, 0); // 设置旋转角度(弧度),如(x, y, z)// 修改模型的缩放model.scale.set(0.2, 0.2, 0.2); // 设置缩放比例 (x, y, z)scene.add(model);});
3. 光源辅助查看
1.点光源辅助查看:
PointLightHelper( light : PointLight, sphereSize : Float, color : Hex )
light – 要模拟的光源.
sphereSize – (可选的) 球形辅助对象的尺寸. 默认为 1.
color – (可选的) 如果没有赋值辅助对象将使用光源的颜色.
const pointLight = new THREE.PointLight( 0xff0000, 1, 100 );
pointLight.position.set( 10, 10, 10 );
scene.add( pointLight );const sphereSize = 1;
const pointLightHelper = new THREE.PointLightHelper( pointLight, sphereSize );
scene.add( pointLightHelper );
2.平行光源辅助查看:
DirectionalLightHelper( light : DirectionalLight, size : Number, color : Hex )
light-- 被模拟的光源.
size – (可选的) 平面的尺寸. 默认为 1.
color – (可选的) 如果没有设置颜色将使用光源的颜色.
const light = new THREE.DirectionalLight( 0xFFFFFF );
const helper = new THREE.DirectionalLightHelper( light, 5 );
scene.add( helper );
4. 案例代码
<template><div class="wrapper"><div ref="threeRef"></div></div>
</template>
<script setup lang="ts">
// 引入three.js
import * as THREE from "three";
// 引入扩展库OrbitControls.js
import { OrbitControls } from "three/addons/controls/OrbitControls.js";
// 引入dat.gui.js的一个类GUI
import { GUI } from "three/addons/libs/lil-gui.module.min.js";
import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js";import { onMounted, ref } from "vue";
const threeRef = ref();
// 模型1
const createMesh1 = () => {const geometry = new THREE.BoxGeometry(10, 10, 10);const textureLoader = new THREE.TextureLoader(); // create a texture loader.const texture = textureLoader.load("/crate.gif"); // load a textureconst material = new THREE.MeshLambertMaterial({// color: 0xff0000,map: texture,side: THREE.DoubleSide, //两面可见});return new THREE.Mesh(geometry, material);
};
// 模型2
const createMesh2 = () => {const geometry = new THREE.BoxGeometry(3, 3, 3);const textureLoader = new THREE.TextureLoader(); // create a texture loader.const texture = textureLoader.load("/grid.png"); // load a texturetexture.repeat.set(2, 2); // 设置纹理的重复次数texture.rotation = Math.PI / 4; // 旋转纹理(以弧度为单位)texture.center.set(0.5, 0.5); // 设置旋转的中心texture.center.set(0.5, 0.5); // 设置旋转的中心const material = new THREE.MeshStandardMaterial({map: texture,});return new THREE.Mesh(geometry, material);
};// 添加光源
const createDictionLight = (target) => {// 平行光const directionalLight = new THREE.DirectionalLight(0xffffff, 1);// 设置光源的方向:通过光源position属性和目标指向对象的position属性计算directionalLight.position.set(10, 15, 25);// 方向光指向对象网格模型mesh,可以不设置,默认的位置是0,0,0directionalLight.target = target;return directionalLight;
};// 添加渲染器
const createRenderer = (dom: HTMLElement) => {const renderer = new THREE.WebGLRenderer({antialias: true, // 设置锯齿属性,为了获得更好的图像质量});// 定义threejs输出画布的尺寸(单位:像素px)renderer.setSize(window.innerWidth, window.innerHeight);// 为了适应不同的硬件设备屏幕,设置设备像素比renderer.setPixelRatio(window.devicePixelRatio);// 插入到任意HTML元素中dom.append(renderer.domElement);return renderer;
};
// 响应式窗口处理
const onResize = (camera, renderer) => {window.onresize = function () {// 更新相机纵横比camera.aspect = window.innerWidth / window.innerHeight;camera.updateProjectionMatrix();// 更新渲染器的大小renderer.setSize(window.innerWidth, window.innerHeight);};
};// 添加操作面板
const createGui = (mesh, light) => {// 实例化一个gui对象const gui = new GUI();//设置操作面板位置gui.domElement.style.right = "0px";gui.domElement.style.width = "300px";//添加光照强度,并使用name重命名,step设置步长gui.add(light, "intensity", 0, 2.0).name("平行光强度").step(0.1);// 添加颜色gui.addColor({color: 0xff0000,},"color").name("颜色").onChange(function (value) {mesh.material.color.set(value);});
};
// 添加了一个相机控制插件,实现平移、旋转和缩放/推拉相以从任何角度查看场景
// 改变的实际上时相机的位置,并不是物体
const createControls = (scene, camera, renderer) => {const controls = new OrbitControls(camera, renderer.domElement);// 这个插件允许您controls.addEventListener("change", function () {renderer.render(scene, camera); //执行渲染操作});
};const init = () => {//! 1.创建场景// 创建3D场景对象Sceneconst scene = new THREE.Scene();scene.background = new THREE.Color("#c1c5d8"); // 设置场景颜色// 物体const mesh1 = createMesh1();mesh1.position.set(0, 0, 0);scene.add(mesh1); // 将模型添加到场景中const mesh2 = createMesh2();mesh2.position.set(0, 8, 0);scene.add(mesh2);//! 2.创建相机// 30:视场角度, width / height:Canvas画布宽高比, 1:近裁截面, 3000:远裁截面const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,1,3000);camera.position.set(10, 10, 10); // 相机位置camera.lookAt(mesh1.position); //指向mesh对应的位置camera.lookAt(mesh2.position); //指向mesh对应的位置// !AxesHelper:辅助观察的坐标系// const axesHelper = new THREE.AxesHelper(20);// scene.add(axesHelper);//渲染const renderer = createRenderer(threeRef.value);renderer.render(scene, camera);// 添加光源const dictionLight = createDictionLight(mesh1);// 将光源添加到场景中scene.add(dictionLight);// 查看平行光const helper = new THREE.DirectionalLightHelper(dictionLight, 5);scene.add(helper);//环境光:没有特定方向,整体改变场景的光照明暗const ambientLight = new THREE.AmbientLight(0xffffff, 0.4);scene.add(ambientLight);// 设置相机控件轨道控制器createControls(scene, camera, renderer);// ! 创建循环动画,使物体可以动起来function rotateRender() {renderer.render(scene, camera); //执行渲染操作mesh1.rotateY(0.01); //每次绕y轴旋转0.01弧度mesh2.rotateX(0.01);requestAnimationFrame(rotateRender); //请求再次执行渲染函数render,渲染下一帧}// 创建GLTFLoader实例const loader = new GLTFLoader();// 加载.gltf文件loader.load("/models/Parrot.glb", function (gltf) {const model = gltf.scene;// 修改模型的位置model.position.set(0, 15, 0); // 设置为(x, y, z),可根据需要调整// 修改模型的旋转model.rotation.set(Math.PI / 4, Math.PI / 4, 0); // 设置旋转角度(弧度),如(x, y, z)// 修改模型的缩放model.scale.set(0.2, 0.2, 0.2); // 设置缩放比例 (x, y, z)scene.add(model);});rotateRender();// 添加操作面板createGui(mesh2, dictionLight);onResize(camera, renderer);
};onMounted(() => {init();
});
</script>
<style scoped></style>
案例纹理图片:位置放在/public
下
https://github.com/mrdoob/three.js/blob/dev/examples/textures/crate.gif
案例gltf文件: 位置放在/public/models
下
https://github.com/mrdoob/three.js/blob/dev/examples/models/gltf/Parrot.glb
🔍【基础】Three.js的零基础入门篇(附案例代码)
🔍【基础】Three.js中添加操作面板,GUI可视化调试(附案例代码)
相关文章:

【基础】Three.js加载纹理贴图、加载外部gltf格式文件
1. 模型使用纹理贴图 const geometry new THREE.BoxGeometry(10, 10, 10);const textureLoader new THREE.TextureLoader(); // 创建纹理贴图加载器const texture textureLoader.load("/crate.gif"); // 加载纹理贴图const material new THREE.MeshLambertMater…...
【区块链 + 人才服务】FISCO BCOS 区块链实训和管理平台 | FISCO BCOS应用案例
中博数科 FISCO BCOS 区块链实训和管理平台主要应用于区块链领域的教育和实训,目的是为学生、教师等用户 提供高效的区块链技术学习和实践体验,同时也为学校提供了一套完整的区块链解决方案。 该平台提供了一套完整的区块链课程体系,包括理论…...

联众优车持续加大汽车金融服务投入与创新,赋能汽车消费新生态
近年来,中国汽车消费市场呈现出蓬勃发展的态势,而汽车金融服务作为降低购车门槛、优化购车体验的重要手段,正日益受到市场的青睐。《2023中国汽车消费趋势调查报告》显示,相较于前一年,今年选择汽车金融服务的市场消费…...

基于yolov8的西红柿检测系统python源码+onnx模型+评估指标曲线+精美GUI界面
【算法介绍】 基于YOLOv8的西红柿检测系统是一种利用深度学习技术的创新应用,旨在通过自动化和智能化手段提高西红柿成熟度检测的准确性和效率。该系统采用YOLOv8算法,该算法是深度学习领域中的先进目标检测模型,具备实时检测和多目标识别的…...

PHP轻量级高性能HTTP服务框架 - webman
摘要 webman 是一款基于 workerman 开发的高性能 HTTP 服务框架。webman 用于替代传统的 php-fpm 架构,提供超高性能可扩展的 HTTP 服务。你可以用 webman 开发网站,也可以开发 HTTP 接口或者微服务。 除此之外,webman 还支持自定义进程&am…...
Python实现人工鱼群算法
博客目录 引言 什么是人工鱼群算法(AFSA)?人工鱼群算法的应用场景为什么使用人工鱼群算法? 人工鱼群算法的原理 人工鱼群算法的基本概念人工鱼的三种行为模式人工鱼群算法的流程人工鱼群算法的特点与优势 人工鱼群算法的实现步骤…...
【网络安全】密码学概述
1. 密码学概述 1.1 定义与目的 密码学是一门研究信息加密和解密技术的科学,其核心目的是确保信息在传输和存储过程中的安全性。密码学通过加密算法将原始信息(明文)转换成难以解读的形式(密文),只有拥有正…...
Java连接SSH
使用JSch库建立SSH连接 JSch是一个纯Java实现的SSH2库,可以用来建立安全的SSH连接。要使用JSch,首先需要将其依赖项添加到您的项目中。如果您使用Maven作为构建工具,可以在pom.xml文件中添加如下依赖: <dependency><gr…...
怎么取消MAC 输入首字母总是自动变大写
一、打开系统偏好设置 点击屏幕左上角的苹果图标()。 在弹出的菜单中选择“系统偏好设置”。偏好设置”。二、进入键盘设置 在系统偏好设置窗口中,找到并点击“键盘”选项。三、调整文本输入设置 在键盘设置窗口中,点击“文本…...

【无损检测】基于用深度学习的工业超声B-Scan 图像中的焊缝缺陷
Automated Weld Defect Detection in Industrial Ultrasonic B-Scan Images Using Deep Learning Abstract: 自动超声波检测(AUT)是一种无损检测(NDT)方法,广泛应用于具有重要经济意义的行业。为了确保对独有的 AUT 数…...

iOS——GCD再学习
GCD 使用GCD好处,具体如下: GCD 可用于多核的并行运算;GCD 会自动利用更多的 CPU 内核(比如双核、四核);GCD 会自动管理线程的生命周期(创建线程、调度任务、销毁线程);…...

SVD降维
文章目录 一、SVD降维的基本原理二、SVD降维的步骤三、SVD降维的优点四、SVD降维的应用五、代码应用六、SVD降维的局限性 一、SVD降维的基本原理 SVD是线性代数中的一种技术,它将一个矩阵A分解为三个矩阵的乘积:A UΣV^T。其中,U和V是正交矩…...

剖析Cookie的工作原理及其安全风险
Cookie的工作原理主要涉及到HTTP协议中的状态管理。HTTP协议本身是无状态的,这意味着每次请求都是独立的,服务器不会保留之前的请求信息。为了在无状态的HTTP协议上实现有状态的会话,引入了Cookie机制。 1. Cookie定义 Cookie,也…...

规控面试复盘
目录 前言 一、京东方 1、CPP和C的区别是什么? 2、讲一下的ROS的话题通信 二、Momenta(泊车部门实习面试) 1、MPC的预测时间步是多少? 2、MPC的代价函数考虑的是什么? 三、九识 1、智能指针有哪些优缺点? 优点: 缺点: 2、Protobuf的数据传输效率为什么更高…...

Elastic Stack--ES集群加密及Kibana的RBAC实战
前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 学习B站博主教程笔记: 最新版适合自学的ElasticStack全套视频(Elk零基础入门到精通教程)Linux运维必备—Elastic…...

【开源免费】基于SpringBoot+Vue.JS图书个性化推荐系统(JAVA毕业设计)
本文项目编号 T 015 ,文末自助获取源码 \color{red}{T015,文末自助获取源码} T015,文末自助获取源码 目录 一、系统介绍1.1 业务分析1.2 用例设计1.3 时序设计 二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究…...

STM32(F103ZET6)第十九课:FreeRtos的移植和使用
目录 需求一、FreeRtos简介二、移植FreeRtos1.复制代码2.内存空间分配和内核相关接口3.FreeRtosConfig4.添加到工程中三、任务块操作1.任务四种状态2.创建任务过程 需求 1.将FreeRtos(嵌入式实时操作系统)移植到STM32中。 2.在该系统中实现任务的创建、…...

索尼的Web3蓝图:从技术创新到现实应用的全方位布局
近年来,随着区块链技术和加密资产的迅猛发展,全球科技巨头纷纷投入其中,力图在Web3浪潮中占据一席之地。作为传统科技行业的巨头,索尼(Sony)也不甘落后,积极推动其Web3战略布局,展现出其在新兴领域的强烈野…...
探索Java中的分布式消息队列与事件总线:架构、实现与最佳实践
引言 在现代分布式系统中,消息队列和事件总线已经成为实现松耦合、高扩展性和高可用性架构的关键组件。无论是微服务架构、事件驱动架构,还是实时数据处理,消息队列和事件总线都扮演着至关重要的角色。本文将深入探讨Java中的分布式消息队列…...

HTML零基础教程(超详细)
一、什么是HTML HTML,全称超文本标记语言(HyperText Markup Language),是一种用于创建网页的标准标记语言。它通过一系列标签来定义网页的结构、内容和格式。HTML文档是由HTML元素构成的文本文件,这些元素包括标题、段…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...