【基础】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可视化调试(附案例代码)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/53260.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一款基于SpringBoot+Element Plus打造的进销存管理系统,方便二次开发或直接使用(附源码)

前言 当前市场上有许多进销存管理软件&#xff0c;但它们往往存在着一些痛点&#xff0c;比如灵活性不足、难以适应快速变化的需求&#xff0c;或者缺乏二次开发的支持。因此&#xff0c;我们需要一款既强大又灵活的软件来处理这些问题。 那么java进销存管理系统就是为了处理…

手把手写深度学习(27):如果获得相机位姿态的plücker embedding?以RealEstate10K为例

手把手写深度学习(0)&#xff1a;专栏文章导航 前言&#xff1a;用plücker embedding表示相机的位姿是一种非常常用的方法&#xff0c;这篇博客以RealEstate10K数据集为例子&#xff0c;详细讲解如何从相机的轨迹坐标中获得plücker embedding&#xff0c;用于下一步模型的学…

Java面试复习总结03

Java面试复习总结03 1、什么是SPI&#xff1f;2、SPI和API有什么区别&#xff1f;3、使用SPI机制的原因&#xff1f;4、SPI机制的优缺点&#xff1f; 1、什么是SPI&#xff1f; SPI 即 Service Provider Interface &#xff0c;字面意思就是&#xff1a;“服务提供者的接口”&…

Arduino library for proteus 下载 安装 测试

Arduino library include: https://drive.google.com/uc?exportdownload&id1P4VtXaomJ4lwcGJOZwR_25oeon9Zzvwb 第一步&#xff1a; 也可从我的共享网盘当中下载&#xff1a; 第2步&#xff1a;解压文件&#xff1a; 第3步&#xff1a; copy lib and idx 到对应的…

java宠物商城网站系统的设计与实现

springboot508基于Springboot宠物商城网站系统 题目&#xff1a;宠物商城网站系统的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往…

PHP一站式班级解决方案班级管家系统小程序源码

一站式班级解决方案 —— 班级管家系统 &#x1f393;【开篇&#xff1a;班级管理的烦恼&#xff0c;你中招了吗&#xff1f;】&#x1f393; 作为班主任或班级管理者&#xff0c;你是否经常为繁琐的班级事务而头疼&#xff1f;从日常通知的发布到作业的收集&#xff0c;从班…

TOGAF之架构标准规范-架构愿景

TOGAF标准规范中&#xff0c;架构愿景阶段的主要工作包括定义企业架构的范围、确认企业架构的利益相关者、创建企业架构愿景、获得利益相关者的批准。 如上所示&#xff0c;架构愿景&#xff08;Architecture Vision&#xff09;在TOGAF标准规范中处于A阶段 如上所示&#xff0…

SpringBoot学习(4)(yml配置信息书写和获取)(SpringEL表达式语言)

目录 1、yml配置信息的书写和获取介绍 2、案例学习 &#xff08;1&#xff09;配置信息的书写注意事项 &#xff08;2&#xff09;配置信息的获取 &#xff08;3&#xff09;注解Value &#xff08;4&#xff09;相同层级的共同前缀&#xff0c;可以使用下面这个注解 3、…

Great Wall长城工作站安装银河麒麟V10(SP1)-ARM版桌面操作系统

长城工作站安装银河麒麟V10(SP1)桌面操作系统 1. 硬件信息 [1]. Great Wall 长城台式微型计算机 产品型号&#xff1a;世恒TD120A2 型号代码&#xff1a;世恒TD120A2-019 电源&#xff1a;220V~3A 50Hz [2]. 芯片型号 架构&#xff1a; aarch64 CPU 运行模式&#xff1a…

2024.9.3 作业

自己实现栈和队列 代码&#xff1a; /*******************************************/ 文件名&#xff1a;sq.h /*******************************************/ #ifndef SQ_H #define SQ_H #include <iostream> #include<cstring>using namespace std; class …

秋招突击——算法练习——8/26——图论——200-岛屿数量、994-腐烂的橘子、207-课程表、208-实现Trie

文章目录 引言正文200-岛屿数量个人实现 994、腐烂的橘子个人实现参考实现 207、课程表个人实现参考实现 208、实现Trie前缀树个人实现参考实现 总结 引言 正文 200-岛屿数量 题目链接 个人实现 我靠&#xff0c;这道题居然是腾讯一面的类似题&#xff0c;那道题是计算最…

[数据集][目标检测]智慧牧场猪只检测数据集VOC+YOLO格式16245张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;16245 标注数量(xml文件个数)&#xff1a;16245 标注数量(txt文件个数)&#xff1a;16245 标…

vue使用html2Canvas导出图片 input文字向上偏移

vue使用html2Canvas导出图片 input文字向上偏移 图中 用的是element的输入框 行高 32px,经常测试 你使用原生的input 还是会出现偏移。 解决方法&#xff1a;修改css样式 1.怎么实现导出 网上随便找很多 2.在第一步 获取你要导出的元素id 克隆后 修改他的样式或者 你直接在你需…

基于单片机的水箱水质监测系统设计

本设计基于STM32F103C8T6为核心控制器设计了水质监测系统&#xff0c;选用DS18B20温度传感器对水箱水体温度进行采集&#xff1b;E-201-C PH传感器获取水体PH值&#xff1b;选用TS-300B浊度传感器检测水体浊度&#xff1b;采用YW01液位传感器获取水位&#xff0c;当检测水位低于…

宽带和带宽分不清楚

如何理解带宽 我们平时经常听到的带宽其实是宽带&#xff0c;举个栗子&#xff1a;我家用的是xx运营商提供的&#xff0c;号称1000M宽带&#xff0c;这其实指是的网络数据传输的速率是&#xff1a;1000Mbs&#xff08;即125MBps&#xff09;。 那么既然有宽带&#xff0c;就有…

MCU官方IDE软件安装及学习教程集合 — STM32CubeIDE(STM32)

简介 各MCU厂商为保证产品的市场地位以及用户体验&#xff0c;不断的完善自己的产品配套&#xff0c;搭建自己的开发生态&#xff0c;像国外ST公司&#xff0c;国内的GD&#xff08;兆易创新&#xff09;&#xff0c;AT&#xff08;雅特力&#xff09;等等。目前就开发生态而言…

09.定时器02

#include "reg52.h"sbit led P3^6;void delay10ms() { //1. 配置定时器0工作模式位16位计时TMOD 0x01;//2. 给初值&#xff0c;定一个10ms出来TL00x00;TH00xDC;//3. 开始计时TR0 1;TF0 0; } void main() {int cnt 0;led 1;while(1){if(TF0 1)//当爆表的时候&a…

【Qt】QLCDNumber | QProgressBar | QCalendarWidget

文章目录 QLCDNumber —— 显示数字QLCDNumber 的属性QLCDNumber 的使用 QProgressBar —— 进度条QProgressBar 的属性创建一个进度条修改为 红色的进度条 QCalendarWidget —— 日历QCalendarWidget 的属性QCalendarWidget 的使用 QLCDNumber —— 显示数字 QLCDNumber 的属…

UE4_后期处理_后期处理材质及后期处理体积一

后期处理效果 在渲染之前应用于整个渲染场景的效果。 后期处理效果&#xff08;Post-processing effect&#xff09;使美术师和设计师能够对影响颜色、色调映射、光照的属性和功能进行组合选择&#xff0c;从而定义场景的整体外观。要访问这些功能&#xff0c;可以将一种称为…

多角度解读WMS:探寻仓库管理系统的核心功能

多角度解读 WMS 仓库管理系统 1. 概述 WMS 在数字化工厂中具有举足轻重的地位&#xff0c;它不仅提高了仓储管理的效率与准确性&#xff0c;还能优化整个供应链的管理&#xff0c;支持灵活生产模式&#xff0c;并提供决策支持的关键数据。通过现代前后端技术的架构设计&#xf…