Three.js加载glb / gltf模型,Vue加载glb / gltf模型(如何在vue中使用three.js,vue使用threejs加载glb模型)

简介:Three.js 是一个用于在 Web 上创建和显示 3D 图形的 JavaScript 库。它提供了丰富的功能和灵活的 API,使开发者可以轻松地在网页中创建各种 3D 场景、模型和动画效果。可以用来展示产品模型、建立交互式场景、游戏开发、数据可视化、教育和培训等等。这里记录一下如何在Vue项目中使用Three.js

Three.js ~ 第 2 篇   ——    Three.js加载glb / gltf模型

先看一下效果(这里加载的是两个模型):

Three.js如何加载GLB / GLTF模型文件(多看注释)?

一、首先,引入功能函数 以及 定义需要使用到的变量

// 引入Three.js库
import * as THREE from "three";
//查看是否引入成功
console.log(three) // 引入轨道控制器
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";// 引入GLTFLoader
// 新版本GLTFLoader位置,新版本的Three.js中,许多模块已经移动到了 jsm 目录下
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'; //旧版本GLTFLoader位置
import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js";//定义变量
let scene, renderer, camera;

二、初始化渲染器

初始化渲染器;就是模型需要渲染的大小,可自行创建,
也可获取元素后,设置成元素的大小;这里获取元素,设置成元素的大小。
initRenderer();
function initRenderer() {const sheepBox = document.getElementById("sheep_box");// 初始化渲染器renderer = new THREE.WebGLRenderer({ antialias: true });// 设置像素比renderer.setPixelRatio(window.devicePixelRatio);// 设置渲染器尺寸renderer.setSize(sheepBox.clientWidth, sheepBox.clientHeight);// 将渲染器的 canvas 元素添加到容器中sheepBox.appendChild(renderer.domElement);// 设置渲染器尺寸// renderer.setSize(window.innerWidth, window.innerHeight);// 将渲染器添加到DOM// document.body.appendChild(renderer.domElement);
}这里首先获取要渲染的容器元素(sheepBox div 元素),
然后通过new THREE.WebGLRenderer({ antialias: true })方法
创建一个新的WebGL渲染器实例(renderer),
然后设置像素比(window.devicePixelRatio),以便在不同的设备像素比下正确显示渲染结果,
再设置渲染器的尺寸,将其大小设置为容器元素的实际尺寸,
通过获取容器元素的 clientWidth 和 clientHeight 属性来实现,
最后将渲染器的 canvas 元素添加到容器中。

注意事项:

  1. 注意这里window才有innerWindth和innerHeight,元素没有innerWindth和innerHeigh;
  2. 所以 元素.innerWidth 这个写法是无效的,因为 innerWidth 不是 DOM 元素的属性,而是用于浏览器窗口(window)的属性,用于获取窗口的内部宽度(即视口宽度,不包括滚动条);
  3. 这里元素使用clientWidth,这个属性返回元素的像素宽度,包括内边距(padding),但不包括边框(border)和外边距(margin)。

三、初始化场景

初始化场景;就是创建一个3d场景对象,这里使用new THREE.Scene()方法创建了
一个新的Three.js场景对象,并将其赋值给变量scene;并设置背景颜色0xa0a0a0
initScene();
function initScene() {// 初始化场景scene = new THREE.Scene();// 场景的背景颜色scene.background = new THREE.Color(0xa0a0a0);
}这里创建了一个新的THREE.Scene对象,并将其赋值给变量scene。
接下来,为场景设置了背景颜色 0xa0a0a0。

四、初始化相机

初始化相机;就是你看到的角度,模型距离屏幕的位置,以及模型的垂直位置等
initCamera()
function initCamera() {// 初始化相机camera = new THREE.PerspectiveCamera(45, // 设置透视相机的角度,单位为度// 设置相机剪裁面的大小,即窗口的宽除以高window.innerWidth / window.innerHeight, 1, // 设置近距裁剪面到相机距离1000 // 设置远距裁剪面到相机距离);// 设置相机位置// 这里设置为距离地面2米的正上方,距离地面5米camera.position.set(1, 2, -5);
}这里使用new THREE.PerspectiveCamera(...)方法创建一个透视相机实例。
传入的参数包括摄像机视图的垂直夹角(vFov)、焦距(focalLength)、
近眼距离(near)和远眼距离(far)。这些参数会影响相机生成的图像的透视效果。然后使用camera.position.set(...)方法设置相机的初始位置。
这里设置了X轴、Y轴和Z轴的位置,分别对应于水平、垂直和近远距离。

五、初始化控制器

初始化控制器;就是是用于操纵相机和场景的交互性功能,如缩放、平移和旋转相机。
initControls();
function initControls() {// 初始化控制器const controls = new OrbitControls(camera, renderer.domElement);
}这里使用new OrbitControls(camera, renderer.domElement) 
创建了一个 OrbitControls 实例,
并将相机和渲染器的 DOM 元素作为参数传递给它。
这意味着用户可以通过鼠标或触摸设备操作三维空间中的相机,以控制视角和位置。

六、初始化需要加载的模型

初始化需要加载的模型;就是用来加载并显示一个名为"Soldier.glb"的模型。
initModels();
function initModels() {const loader = new GLTFLoader();loader.load("/models/Soldier.glb", function (glb) {打印查看模型文件console.log(glb);scene.add(glb.scene);});
}这里先使用new GLTFLoader()创建一个loader;
然后调用GLTFLoader的load方法,传入两个参数:
模型文件的URL("/models/Soldier.glb")和一个回调函数;
回调函数将在模型加载完成后执行。
最后通过scene.add(gltf.scene)方法,
将加载完成的模型添加到场景中(即Vue.js应用程序的渲染场景)。

可以看到控制台,打印成功,拿到glb模型,然后添加渲染。最后,就可以在页面对3d场景进行交互操作。

七、监听拖拽窗口事件,在事件触发时,重新绘制

监听窗口缩放
window.addEventListener("resize", function () {const sheepBox = document.getElementById("sheep_box");// 设置相机视野比camera.aspect = sheepBox.clientWidth / sheepBox.clientHeight;// 更新投影矩阵camera.updateProjectionMatrix();// 设置渲染器尺寸renderer.setSize(sheepBox.clientWidth, sheepBox.clientHeight);// // 设置相机视野比 浏览器、window的可视宽高// camera.aspect = window.innerWidth / window.innerHeight;// // 设置渲染器尺寸 浏览器、window的可视宽高// renderer.setSize(window.innerWidth, window.innerHeight);
});

八、如果是加载压缩后的glb / gltf 文件,则需要添加解压文件和解压步骤

加载压缩后的glb / gltf文件需要在项目中配置解码器,draco,具体操作如下:

1、首先需要解码文件,直接去github上下载,地址如下

dracoicon-default.png?t=N7T8https://github.com/google/draco

2、提取draco中的重要文件,放在public文件下,方便使用

对于 DRACO 解码器相关文件,只需要将以下文件放置在您的项目中:

  1. draco_decoder.wasm: 这是 DRACO 解码器的 WebAssembly 文件。
  2. draco_decoder.js: 这是 DRACO 解码器的 JavaScript 封装文件。
  3. draco_wasm_wrapper.js: 这是用于包装和加载 DRACO 解码器 WebAssembly 文件的 JavaScript 文件。

这些文件是用于在浏览器中解码 DRACO 压缩的模型数据的必要文件。可以将这些文件放置在项目的 public 目录下的一个名为 draco 的子目录中,然后在代码中使用相对于根目录的路径来指定 DRACO 文件的位置,以便 GLTFLoader 能够正确加载和使用解码器。

3、想直接拿draco文件,在这

Draco功能代码文件icon-default.png?t=N7T8https://download.csdn.net/download/weixin_65793170/89122540?spm=1001.2014.3001.5503

4、draco文件的具体引用

        //创建一个新的Draco实例const dracoLoader = new DRACOLoader();// 设置 DRACOLoader 的路径,通常是 DRACO 压缩库的路径// 请替换为您的实际路径dracoLoader.setDecoderPath("/draco/");// 将 DRACOLoader 实例传递给 GLTFLoaderloader.setDRACOLoader(dracoLoader);

5、全部代码,加载压缩的glb / gltf模型文件(初始化需要加载的模型)

function initModels() {const loader = new GLTFLoader();//创建一个新的Draco实例const dracoLoader = new DRACOLoader();// 设置 DRACOLoader 的路径,通常是 DRACO 压缩库的路径// 请替换为您的实际路径dracoLoader.setDecoderPath("/draco/");// 将 DRACOLoader 实例传递给 GLTFLoaderloader.setDRACOLoader(dracoLoader);loader.load("/models/forest_house.glb", function (glb) {// console.log(glb);scene.add(glb.scene);// const clip = glb.animations[1];// mixer = new THREE.AnimationMixer(glb.scene);// // const action = mixer.clipAction(clip).play();// const action = mixer.clipAction(clip);// action.play();});
}

Three.js支持的颜色格式?

.Color(0xa0a0a0); .Color("#8080ff") .Color("red")

如何全局使用Three.js

1、在main.js中引入Three.js库以及所需的组件

import * as THREE from 'three';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';

2、在Vue的原型链上设置全局变量,以便在整个应用中可以访问到Three.js及其组件

Vue.prototype.$THREE = THREE;
Vue.prototype.$OrbitControls = OrbitControls;
Vue.prototype.$GLTFLoader = GLTFLoader;

3、这样做后,可以在整个Vue应用的任何地方使用

通过以下方法,来访问Three.js库this.$THREE
this.$OrbitControls
this.$GLTFLoader

更多操作,Three.js官网  >>

Three.js官网icon-default.png?t=N7T8https://threejs.org/

创作不易,感觉有用,就一键三连,感谢(●'◡'●)

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

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

相关文章

常用的数据结构及算法

一、数据结构 (一)线性结构:一对一。 1.可以使用数组、链表来表示。数组又分为静态数组和动态数组两种。链表常用的是单链表。 2.两种特殊的线性结构:队列和栈。其中队列是先进先出(排队),栈…

SpringBoot3 集成Springdoc 实现Swagger3功能

说明: 只通过引用org.springdoc 的两个包就可以使用Swagger3 功能(步骤1);如想更美观及实现动态认证的开启与关闭,及Swagger3登录认证等功能,需实现(步骤1、2、3)的配置; 1、 引包…

chrome浏览器查看css样式

样式的查看 1.匹配器为灰色文本: 表示非当前选择器 2.样式有划线标识:CSS属性无效或未知 / 属性值无效 / 被其他属性覆盖的属性 3.属性以浅色文本显示且有感叹号提示:属性虽然有效,但由于CSS逻辑而没有任何影响 转自:…

2024HW --->蓝队面试题

这段时间在写横向移动,搞得鸽了很久(内网真的很玄学) 还没写完。。。 但是这不是准备HW了吗。小编也来整理一下自己收集到的题目吧!!! (仅为个人见解,不代表最终答案)&…

react中useState的值没有改变,而是旧的数值

问题背景 想实现点击按钮就改变数据的效果,但是在控制台的打印结果,总是上一次的修改情况,并不是最新的修改后的数据 代码: import { useState, useRef } from "react";// 实现sonA的数据传递给sonB const SonA () …

C语言联合体详解

下午好诶,今天小眼神给大家带来一篇C语言联合体详解的文章~ 目录 联合体 1. 联合体类型的声明 2. 联合体的特点 代码一: 代码二: 3. 相同成员的结构体和联合体对比 ​编辑4. 联合体大小的计算 5. 联合体的优点 联合体 1. 联合体…

第62天:服务攻防-框架安全CVE 复现SpringStrutsLaravelThinkPHP

目录 思维导图 常见语言开发框架: 案例一:PHP-开发框架安全-Thinkphp&Laravel Thinkphp3.2.x日志泄露 自动化脚本检测 如何getshell 手工注入 ​ThinkPHP5 5.0.23 手工注入 工具检测 laravel-cve_2021_3129 案例二:JAVAWEB-开…

pytorch与深度学习

ChatGPT PyTorch是一个由Facebook AI Research Team开发的开源深度学习库,它提供了一个灵活的环境和丰富的API,用于快速且方便地构建、训练和部署深度学习模型。PyTorch在科学界和工业界都收到了广泛的使用,其中包括了学术研究、小型项目和大…

Chrome修改主题颜色

注意:自定义Chrome按钮只在搜索引擎为Google的时候出现。

如何30天快速掌握键盘盲打

失业后在家备考公务员,发现了自己不正确的打字方式,决定每天抽出一点时间练习打字。在抖音上看到一些高手的飞速盲打键盘后,觉得使用正确的指法打字是很必要的。 练习打字,掌握正确的键盘指法十分关键。 练习打字的第一步是找到…

关于电商独立站搭建中电商API数据采集接口的应用

搭建供应链系统时,您可能需要与电商平台进行集成,以实现订单管理、库存同步、物流跟踪等功能。以下是一些常见的电商接口,可以帮助您构建供应链系统: 1. **淘宝开放平台接口**:淘宝开放平台提供了丰富的接口&#xff…

AI System AI系统对大模型的影响有多深?

AI System AI系统对大模型的影响有多深?要回答这个问题之前,不妨从下面这个问题开始入手思考。 大模型进入了爆发期后,在 LLM 进化树中,BERT(Encoder-Only)、T5(Encoder-Decoder)、…

社交创新的标杆:解读Facebook的社交模式

引言 在当今数字化时代,社交媒体已成为人们日常生活和沟通的重要工具。作为全球最大的社交媒体平台,Facebook不仅改变了我们的社交模式,而且对全球的社交文化、商业活动和公共事务产生了深远的影响。本文将深入探讨Facebook的社交模式&#…

C++:面向对象三大特性之一:继承

继承 1.继承理解2.继承方式引起访问变化表格表格理解 3.赋值转换1.普通对象赋值2.继承对象赋值:赋值转换注意 4.继承的作用域5.派生类默认成员函数1.构造函数2.析构函数3.拷贝构造4.赋值重载 6.继承与友元7.继承与静态成员 1.继承理解 继承机制是面向对象程序设计使…

求a+aa+aaa+……(C语言)

一、题目&#xff1b; 二、N-S流程图&#xff1b; 三、运行结果&#xff1b; 四、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int a 0;int n 0;int i 0;int result 0;int tn 0;//提示用户&am…

spring事务@Transactional

定义一个项目测试 spring 的事务支持情况 项目准备 创建一个名为 mybatis-transaction 的 spring boot 2.x 项目&#xff0c;引入 mybatis 的依赖&#xff0c;如下 使用 spring 官网的脚手架生成项目 https://start.spring.io/ 下载完毕后 pom.xml 如下 <?xml version&quo…

【GPTs分享】GPTs分享之 AskYourPDF Research Assistant​

一、简介 AskYourPDF Research Assistant 是一款高级人工智能研究助手&#xff0c;专门设计用于帮助用户高效从PDF文件和文章中提取信息。它结合了深度学习技术和自然语言处理能力&#xff0c;以便用户能够快速地查询、总结及处理文档内容&#xff0c;并能够生成与文章内容相关…

Redux入门:使用@reduxjs/toolkit构建React应用程序状态管理

随着应用程序复杂性的增加,有效管理应用程序状态变得越来越重要。Redux是一种流行的状态管理解决方案,随着应用程序复杂性的增加,有效管理应用程序状态变得越来越重要。Redux是一种流行的状态管理解决方案,但传统的Redux设置和使用过程比较繁琐。幸运的是,Redux官方团队推出了r…

Nginx防盗链:资源保护新利器,拒绝盗链行为!

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ Nginx防盗链是一种安全机制&#xff0c;用于防止其他网站直接链接到你的网站上的资源&#xff08;如图片、视频、文件等&#xff09;&#xff0c;从而避免不必要的带宽消耗…

P1278 单词游戏 简单搜索+玄学优化

单词游戏 传送门 题目描述 Io 和 Ao 在玩一个单词游戏。 他们轮流说出一个仅包含元音字母的单词&#xff0c;并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致。 游戏可以从任何一个单词开始。 任何单词禁止说两遍&#xff0c;游戏中只能使用给定词典中含有…