Vue集成three.js,加载glb、gltf类型的3d模型

安装基本依赖

// 注意OrbitControls要加{},注意路径是jsm
import { OrbitControls } from ‘three/examples/jsm/controls/OrbitControls.js’;
// import { dat } from ‘three/examples/jsm/controls/dat.gui.js’;
// dat gui这个插件,是另外自己下载的,threejs的安装包里没有这个
// dat gui组件能够方便地改变某些值,并快速预览这些值的改变所产生的变化
import { GLTFLoader } from ‘three/examples/jsm/loaders/GLTFLoader.js’;

创建一个模版容器

<template><div><!-- 本案例演示导入模型 --><div id="container" /></div></template>

初始化相机、场景

init() {
const container = document.getElementById(‘container’);
this.camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
// 特别注意,相机的位置要大于几何体的尺寸
this.camera.position.z = -10;
this.scene = new THREE.Scene();
this.renderer = new THREE.WebGLRenderer({
// 抗锯齿性
antialias: true
});
// 设置背景色
this.renderer.setClearColor(‘#428bca’, 1.0);
this.renderer.setSize(window.innerWidth, window.innerHeight);
container.appendChild(this.renderer.domElement);

// 环境光不能用来投射阴影,因为它没有方向。
var ambienLight = new THREE.AmbientLight(0xcccccc);
this.scene.add(ambienLight);
// 初始化轨道控制器
// 还需要配合animate,不断循环渲染,达到用鼠标旋转物体的作用。
this.orbitControls = new OrbitControls(this.camera, this.renderer.domElement);
// 窗口大小自适应
window.addEventListener(‘resize’, this.onWindowResize, false);
},

加载glb文件

  loadModel() {var loader = new GLTFLoader();// 路径要特别注意,默认是从public读取的,模型文件必须放在public下,并且路径前的public要省略loader.load('/glb/glb-3.glb', gltf => {// 设置模型尺寸this.model = gltf.scene;this.model.scale.set(5, 5, 5);this.model.position.y = -5;this.scene.add(this.model);}, undefined, error => {console.error(error);});}

glb文件链接https://sketchfab.com/tags/glb

完整代码

<template><div><!-- 本案例演示导入模型 --><div id="container" /></div></template><script>
import * as THREE from 'three';
// 注意OrbitControls要加{},注意路径是jsm
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
// import { dat } from 'three/examples/jsm/controls/dat.gui.js';
// dat gui这个插件,是另外自己下载的,threejs的安装包里没有这个
// dat gui组件能够方便地改变某些值,并快速预览这些值的改变所产生的变化
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';export default {name: 'Example',data() {return {scene: null,renderer: null,camera: null,orbitControls: null,model: null};},mounted() {this.init();this.loadModel();this.animate();},// 后续还要在beforeDestory中进行销毁beforeDestroy() {this.scene = null;this.renderer = null;this.camera = null;this.orbitControls = null;this.model = null;},methods: {init() {const container = document.getElementById('container');this.camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);// 特别注意,相机的位置要大于几何体的尺寸this.camera.position.z = -10;this.scene = new THREE.Scene();this.renderer = new THREE.WebGLRenderer({// 抗锯齿性antialias: true});// 设置背景色this.renderer.setClearColor('#428bca', 1.0);this.renderer.setSize(window.innerWidth, window.innerHeight);container.appendChild(this.renderer.domElement);// 环境光不能用来投射阴影,因为它没有方向。var ambienLight = new THREE.AmbientLight(0xcccccc);this.scene.add(ambienLight);// 初始化轨道控制器// 还需要配合animate,不断循环渲染,达到用鼠标旋转物体的作用。this.orbitControls = new OrbitControls(this.camera, this.renderer.domElement);// 窗口大小自适应window.addEventListener('resize', this.onWindowResize, false);},animate() {setTimeout(() => {this.model.rotation.x += 0.01;this.model.rotation.y += 0.01;this.model.rotation.z += 0.01;}, 500);requestAnimationFrame(this.animate);this.renderer.render(this.scene, this.camera);},onWindowResize() {this.camera.aspect = window.innerWidth / window.innerHeight;this.camera.updateProjectionMatrix();this.renderer.setSize(window.innerWidth, window.innerHeight);},loadModel() {var loader = new GLTFLoader();// 路径要特别注意,默认是从public读取的,模型文件必须放在public下,并且路径前的public要省略loader.load('/glb/glb-3.glb', gltf => {// 设置模型尺寸this.model = gltf.scene;this.model.scale.set(5, 5, 5);this.model.position.y = -5;this.scene.add(this.model);}, undefined, error => {console.error(error);});}}
};
</script><style scoped>#container {height: 100%;}</style>

效果图

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络---第十一天

生成树协议 stp作用&#xff1a; 作用&#xff1a;stp用于解决二层环路问题。 BPDU&#xff1a; 含义&#xff1a;桥协议数据单元&#xff0c;用于传递stp协议相关报文 分类&#xff1a;配置bpdu---用于传递stp的配置信息 tcn bpdu---用于通告拓扑变更信息 包含信息&…

【性能测试】ChaosTesting(混沌测试)ChaosBlade(混沌实验工具)(四)-k8s容器混沌实验

5. 创建 kubernetes 相关的实验场景 5.0 blade create k8s 5.0.1 介绍 创建 kubernetes 相关的实验场景&#xff0c;除了使用 blade 命令创建场景外&#xff0c;还可以将实验使用 yaml 文件描述&#xff0c;使用 kubectl 命令执行。目前支持的实验场景如下&#xff1a; [bl…

基于spring boot学生综合测评系统

基于spring boot学生综合测评系统设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件…

重磅!Llama-3,最强开源大模型正式发布!

4月19日&#xff0c;全球科技、社交巨头Meta在官网&#xff0c;正式发布了开源大模型——Llama-3。 据悉&#xff0c;Llama-3共有80亿、700亿两种参数&#xff0c;分为基础预训练和指令微调两种模型&#xff08;还有一个超4000亿参数正在训练中&#xff09;。 与Llama-2相比&…

如何阻止cPanel与WHM自动重定向到服务器主机名

本周有一个客户&#xff0c;购买Hostease的VPS主机&#xff0c;询问我们的在线客服&#xff0c;如何阻止cPanel / WHM自动重定向到服务器主机名。我们为用户提供教程&#xff0c;用户很快完成了设置。在此&#xff0c;我们分享这个操作教程&#xff0c;希望可以对您有帮助。 接…

Python自学篇2-导入Win32库

Python导入win32模块 导入win32模块可以让我们在Python中使用Windows的API功能&#xff0c;这对于开发需要与Windows操作系统进行交互的应用程序非常有用。 本文将介绍如何导入win32模块&#xff0c;并提供一些代码示例来帮助读者更好地理解。 什么是win32模块&#xff1f; …

吴恩达机器学习笔记:第 8 周-13 聚类(Clustering)13.3-13.5

目录 第 8 周 13、 聚类(Clustering)13.3 优化目标13.4 随机初始化13.5 选择聚类数 第 8 周 13、 聚类(Clustering) 13.3 优化目标 K-均值最小化问题&#xff0c;是要最小化所有的数据点与其所关联的聚类中心点之间的距离之和&#xff0c;因此 K-均值的代价函数&#xff08;又…

【1646】医院人员管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 医院人员管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

【vue2】实现微信截图(复制图片)在项目内可粘贴

需求 后台管理在上传图片地方需要将复制的图片粘贴上传 一、添加事件 在原有上传组件的基础上添加 paste事件 二、方法 onPaste(e) {const items (e.clipboardData || window.clipboardData).items;let blob null;for (let i 0; i < items.length; i) {if (items[i].ty…

PS入门|用PS设计物品尺寸,需要注意的几个重要问题

注&#xff1a;仅学习使用 【PS24】2024版本更新的内容比较多&#xff0c;对电脑配置的要求也是比较高的。建议配置&#xff1a;第十代i5或以上CPU。 如果是第十代i3或以下的CPU&#xff0c;建议安装PS2021或者以下版本。 ---这是一条不正经的分割线--- 讲了那么久的PS教程…

Matlab 对nc文件进行处理

1.介绍nc文件 NetCDF全称为network Common Data Format&#xff0c;中文译法为“网络通用数据格式”&#xff1b;netcdf文件开始的目的是用于存储气象科学中的数据&#xff0c;现在已经成为许多数据采集软件的生成文件的格式。 •从数学上来说&#xff0c;netcdf存储的数据就是…

springboot停机关闭前保证处理完请求

application.yml配置 server:shutdown: graceful // 处理完请求在关闭服务server:shutdown: immediate // 立刻关闭&#xff0c;默认 jvm关闭自带的回调

fakak详解(2)

Kafka和Flume整合 Kafka与flume整合流程 Kafka整合flume流程图 flume主要是做日志数据(离线或实时)地采集。 图-21 数据处理 图-21显示的是flume采集完毕数据之后&#xff0c;进行的离线处理和实时处理两条业务线&#xff0c;现在再来学习flume和kafka的整合处理。 配置fl…

Python基础学习之去除换行符

strip() 方法 strip() 方法用于去除字符串开头和结尾的空白字符&#xff0c;包括换行符&#xff08;\n&#xff09;、制表符&#xff08;\t&#xff09;和空格等。如果您想从字符串数据中去掉换行符&#xff0c;无论是单独存在的还是与其他空白字符一起&#xff0c;strip() 方…

【LAMMPS学习】八、基础知识(4.3)TIP3P水模型

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

李沐57_长短期记忆网络LSTM——自学笔记

LSTM 1.忘记门&#xff1a;将值朝着0减少 2.输入门&#xff1a;决定不是忽略掉输入数据 3.输出门&#xff1a;决定是不是使用隐状态 !pip install --upgrade d2l0.17.5 #d2l需要更新首先加载时光机器数据集。 import torch from torch import nn from d2l import torch a…

「React Native」为什么要选择 React Native 作为的跨端方案

文章目录 前言一、常见因素二、举个栗子2.1 项目背景2.2 为什么选择 React Native2.3 项目实施2.4 成果总结 前言 没有完美的跨端技术&#xff0c;只有适合的场景。脱离适用场景去谈跨端技术没有什么意义。 一、常见因素 共享代码库&#xff1a; React Native 允许开发者编写…

LeetCode78:子集

题目描述 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的 子集 &#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 代码 class Solution { public:vector<vector<int>> res;vector<…

团队如何异地共享文件?

在当今全球化的办公环境中&#xff0c;团队成员往往分散在不同的地理位置上。为了更好地协同工作&#xff0c;团队之间需要快速、安全地共享文件。本文将介绍一种名为“团队异地共享文件”的解决方案&#xff0c;它能够帮助团队成员在不同地点方便地共享文件&#xff0c;提高工…

代码随想录第四天打卡笔记

链表part2 1&#xff09;两两交换链表中的节点 这道题按照三步走方式&#xff1a; &#xff08;1&#xff09;第一步&#xff0c;设置cur指针指向这两个元素的第一个&#xff08;这里一定要注意保存原结点&#xff01;&#xff09;&#xff0c;断开cur与第一个节点的链接&…