封装一个基于ThreeJS渲染基础模型的类,非常简单,可拖动可缩放

工作需求要求threeJS渲染一个模型以供可视化大屏展示,抛出模型精度不谈,只说业务实现

1.Three.JS的引入

ThreeJS官网地址:Three.js – JavaScript 3D Library

查看文档

中文切换及安装创建步骤

如果是自己研究学习用的,在官网安装完后,直接在-创建一个场景-里面直接copy代码玩就行了

如果是业务需求相关,希望快速构建一个简单的模型模块看下一页

2.封装模型模块

第一步先引入模块相关的threeJS模块

import * as THREE from 'three';// gltf文件装载器import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';// 视图旋转控件import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';

第二步构建一个class类并初始化constructor内的参数

class ThreeModel {constructor(GLTF, Dom) {this.glft = GLTF; // 模型文件this.Dom = Dom; // dom容器this.scene = new THREE.Scene(); // 实例化场景this.camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 20000); // 实例化相机this.renderer = new THREE.WebGLRenderer(); // 实例化渲染器this.loader = new GLTFLoader(); // 实例化gltf装载器this.CameraPosition = {x: 0,y: 2600,z: 0}}
}

constructor内的参数分别为GLTF(引用的gltf格式模型文件)、Dom(挂载的dom元素)

我使用的vue2框架,调用该模块时须传入以下

import { ThreeModel } from "../three.js"...mounted() {const model_one = new ThreeModel('Texture/scene.gltf', this.$refs.box);model_one.init()}

接下来是类里面的初始化函数

    init() {this.renderer.setSize(window.innerWidth, window.innerHeight);this.Dom.appendChild(this.renderer.domElement);this.loader.load(this.glft,(gltf) => {const model = gltf.scene;// 创建一个Object3D对象const modelContainer = new THREE.Object3D();// 将模型的网格添加到Object3D对象中modelContainer.add(model);// 添加Object3D对象到场景中this.scene.add(modelContainer);},undefined,(err) => {console.log('报错', err)})this.initControls();this.initLight();this.initCamera();const animate = () => {requestAnimationFrame(animate);// 在此处更新场景的其他内容this.renderer.render(this.scene, this.camera);}animate();}

初始化控制三维场景缩放和旋转的函数

    initControls() { //使用OrbitControls控制三维场景缩放和旋转等功能this.controls = new OrbitControls(this.camera, this.renderer.domElement);//动态阻尼系数 即鼠标拖拽旋转的灵敏度this.controls.dampingFactor = 0.25;// this.controls.target.set(0, 900, 0)// //上下旋转范围this.controls.minPolarAngle = 0;this.controls.maxPolarAngle = 1.5;this.controls.autoRotate = true;//惯性滑动,滑动大小默认0.25this.controls.dampingFactor = 0.25;//滚轮是否可控制zoom,zoom速度默认1//缩放倍数this.controls.zoomSpeed = 1.0;//最大最小相机移动距离(景深相机)this.controls.minDistance = 1;this.controls.maxDistance = Infinity;//水平方向视角限制this.minAzimuthAngle = -Math.PI * 2;this.maxAzimuthAngle = Math.PI * 2;this.controls.enabledPan = true;this.keyPanSpeed = 7.0;}

初始化光照函数

    initLight() { // 初始化光照let ambientLight = new THREE.AmbientLight(0x404040);this.scene.add(ambientLight);//定义灯,并设置位置this.light = new THREE.DirectionalLight(0x333333);this.light.position.set(60, 30, 40);this.light2 = new THREE.DirectionalLight(0xdddddd);this.light2.position.set(-20, 20, -20);this.scene.add(this.light);this.scene.add(this.light2);}

初始化相机函数

initCamera() {//初始化相机this.scene.scale.set(0.1, 0.1, 0.1)this.camera.position.set(0, this.CameraPosition.y, 0); // 设置相机位置,根据需求调整坐标this.camera.lookAt(1, 1, 5); // 设置相机观察的目标位置}

以下是完整代码

import * as THREE from 'three';
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
// 视图旋转控件
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
// 拖拽控件
// import { DragControls } from 'three/examples/jsm/controls/DragControls';
class ThreeModel {constructor(GLTF, Dom) {this.glft = GLTF; // 模型文件this.Dom = Dom; // dom容器this.scene = new THREE.Scene(); // 实例化场景this.camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 20000); // 实例化相机this.renderer = new THREE.WebGLRenderer(); // 实例化渲染器this.loader = new GLTFLoader(); // 实例化gltf装载器this.CameraPosition = {x: 0,y: 2600,z: 0}}init() {this.renderer.setSize(window.innerWidth, window.innerHeight);this.Dom.appendChild(this.renderer.domElement);this.loader.load(this.glft,(gltf) => {const model = gltf.scene;// 创建一个Object3D对象const modelContainer = new THREE.Object3D();// 将模型的网格添加到Object3D对象中modelContainer.add(model);// 添加Object3D对象到场景中this.scene.add(modelContainer);},undefined,(err) => {console.log('报错', err)})this.initControls();this.initLight();this.initCamera();const animate = () => {requestAnimationFrame(animate);// 在此处更新场景的其他内容this.renderer.render(this.scene, this.camera);}animate();}initControls() { //使用OrbitControls控制三维场景缩放和旋转等功能this.controls = new OrbitControls(this.camera, this.renderer.domElement);//动态阻尼系数 即鼠标拖拽旋转的灵敏度this.controls.dampingFactor = 0.25;// this.controls.target.set(0, 900, 0)// //上下旋转范围this.controls.minPolarAngle = 0;this.controls.maxPolarAngle = 1.5;this.controls.autoRotate = true;//惯性滑动,滑动大小默认0.25this.controls.dampingFactor = 0.25;//滚轮是否可控制zoom,zoom速度默认1//缩放倍数this.controls.zoomSpeed = 1.0;//最大最小相机移动距离(景深相机)this.controls.minDistance = 1;this.controls.maxDistance = Infinity;//水平方向视角限制this.minAzimuthAngle = -Math.PI * 2;this.maxAzimuthAngle = Math.PI * 2;this.controls.enabledPan = true;this.keyPanSpeed = 7.0;}initLight() { // 初始化光照let ambientLight = new THREE.AmbientLight(0x404040);this.scene.add(ambientLight);//定义灯,并设置位置this.light = new THREE.DirectionalLight(0x333333);this.light.position.set(60, 30, 40);this.light2 = new THREE.DirectionalLight(0xdddddd);this.light2.position.set(-20, 20, -20);this.scene.add(this.light);this.scene.add(this.light2);}initCamera() {//初始化相机this.scene.scale.set(0.1, 0.1, 0.1)this.camera.position.set(0, this.CameraPosition.y, 0); // 设置相机位置,根据需求调整坐标this.camera.lookAt(1, 1, 5); // 设置相机观察的目标位置}
}
export { ThreeModel }

3.注意事项和说明

说明:

1.第三方模型文件要按照threeJS支持的格式要求

如图:

2.模型市场

推荐Explore 3D Models - Sketchfab

注意事项:

我使用的是vue项目,一定要将模型文件存放在public文件夹下,否则找不到或报引用错误

本人接触threeJS不多,该模块仅限于基础功能的使用,适用性较低,如果有懂的大佬希望评论或私信交流,如有错误请指出

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

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

相关文章

linux的基本指令

目录 ls指令: pwd指令: cd指令: touch指令: mkdir指令: rmdir指令: rm指令: man指令: mv指令: cat指令: more指令: less指令: head指…

Blazor Table 实现获取当前选中行的功能

这里需要使用到OnClickRowCallBack事件 后台使用案例

【Python】数据分析案例:世界杯数据可视化 | 文末送书

文章目录 前期数据准备导入数据 分析:世界杯中各队赢得的比赛数分析:先打或后打的比赛获胜次数分析:世界杯中的抛硬币决策分析:2022年T20世界杯的最高得分者分析:世界杯比赛最佳球员奖分析:最适合先击球或追…

全能音乐制作环境——水果编曲软件FL Studio 21.1版本下载安装配置

目录 前言一、FL Studio 安装二、使用配置总结 前言 FL Studio是一款流行的图像线软件制作和编辑音频文件。作为一款领先的创新产品,该软件能够满足在创作音乐方面的需求。有了这个产品,可以完成制作音乐的整个过程。可以使用这个软件进行写作&#xff…

YOLOv5实现目标分类计数并显示在图像上

有同学后台私信我,想用YOLOv5实现目标的分类计数,因此本文将在之前目标计数博客的基础上添加一些代码,实现分类计数。阅读本文前请先看那篇博客,链接如下: YOLOv5实现目标计数_Albert_yeager的博客 1. 分类实现 以co…

深入理解 Java Bean 的生命周期及各个阶段解析

目录 引言:一、什么是Java Bean二、Bean的生命周期概述三、Bean的创建阶段四、属性设置阶段初始化阶段六、使用阶段七、销毁阶段 引言: Java Bean是Java编程中经常使用的重要概念,它是可重用、可移植、可序列化的组件。在Java开发中&#xf…

最新的外贸自建站教程?做外贸如何建网站?

外贸自建站教程步骤有哪些?海洋建站如何做网站搭建? 想要了解关于外贸自建站的最新教程吗?外贸自建站不再是高不可攀的难题,相反,它为企业提供了更多的机会和自主掌握业务的空间。海洋建站将为您提供一份全面的指南&a…

Android 编译的配置文件:android.mk 和android.bp

Android.bp文件首先是Android系统的一种编译配置文件,是用来代替原来的Android.mk文件的。在Android7.0以前,Android都是使用make来组织各模块的编译,对应的编译配置文件就是Android.mk。在Android7.0开始,Google引入了ninja和kat…

什么是大数据测试?有哪些类型?应该怎么测?

随着目前世界上各个国家使用大数据应用程序或应用大数据技术场景的数量呈指数增长,相应的,对于测试大数据应用时所需的知识与大数据测试工程师的需求也在同步增加。 针对大数据测试的相关技术已慢慢成为当下软件测试人员需要了解和掌握的一门通用技术。…

SPSS生存分析:寿命表分析

前言: 本专栏参考教材为《SPSS22.0从入门到精通》,由于软件版本原因,部分内容有所改变,为适应软件版本的变化,特此创作此专栏便于大家学习。本专栏使用软件为:SPSS25.0 本专栏所有的数据文件请点击此链接下…

15 网关实战: 微服务集成Swagger实现在线文档

上节介绍了网关层面聚合API文档,通过网关的路由信息找到了各个服务的请求地址,这节讲一下微服务如何集成Swagger。 网关的API文档默认调用的是微服务的**/v2/api-docs**这个接口获取API详细信息,比如文章服务的URL:http://localhost:9000/blog-article/v2/api-docs,返回信…

Python分享之字符串格式化 (%操作符)

在许多编程语言中都包含有格式化字符串的功能,比如C和Fortran语言中的格式化输入输出。Python中内置有对字符串进行格式化的操作%。 模板 格式化字符串时,Python使用一个字符串作为模板。模板中有格式符,这些格式符为真实值预留位置&#xff…

Python二叉树用法介绍

更多资料获取 📚 个人网站:ipengtao.com 二叉树是一种常见的数据结构,具有树形结构,每个节点最多有两个子节点。Python中有多种方式来表示和操作二叉树,本文将介绍二叉树的基本概念、构建、遍历和一些常见操作&#x…

3个.NET开源免费的仓库管理系统(WMS)

前言 今天给大家推荐3个.NET开源免费的WMS仓库管理系统(注意:以下排名不分先后)。 仓储管理系统介绍 仓储管理系统(Warehouse Management System,WMS)是一种用于管理和控制仓库操作的软件系统&#xff0…

F5社区学习心得分享:如何克服云迁移挑战?

伴随数字时代的快速发展,很多企业都会借助云迁移,踏上转型之旅。尽管云迁移被认为是一种能够节约成本,且不会影响正常运营的现代化改造举措,然而我们并不能低估它的复杂性。正如有研究表明,约有41%的企业并没有通过云迁…

lv11 嵌入式开发 WDT实验 12

目录 1 WDT简介 2 Exynos4412下的WDT控制器 2.1 概述 2.2 WDT的特性 2.3 工作原理 2.4 其他细节 3 WDT寄存器详解 3.1 WTCON控制寄存器 3.2 WTDAT 实时中断寄存器 3.3 WTCNT 递减计数器 3.4 WTCLRINT清除中断寄存器 4 WDT编程 1 WDT简介 Watch Dog Timer即看门狗定…

ZKP15.2 Formal Methods in ZK (Part I)

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 15: Secure ZK Circuits via Formal Methods (Guest Lecturer: Yu Feng (UCSB & Veridise)) 15.2 Formal Methods in ZK (Part I) Circuits Workflow Source Code: Witness Generation and ConstraintsWitness Generatio…

【力扣】 209. 长度最小的子数组

【力扣】 209. 长度最小的子数组 文章目录 【力扣】 209. 长度最小的子数组1. 题目介绍2. 解法2.1 暴力求解2.2 前缀和 二分查找2.3 滑动窗口2.4 贪心回溯 3. Danger参考 1. 题目介绍 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 …

ubuntu安装远程桌面

ubuntu安装远程桌面 xrdp远程桌面访问 #用windows远程桌面连接成功,只能用root用户,用普通用户连接是灰色 sudo apt install xrdp systemctl status xrdpsystemctl stop xrdp解决普通用户连接是灰色 参考链接: https://blog.csdn.net/leegh1992/article/details/51160864 s…

PyCharm安装PyQt5及工具(Qt Designer、PyUIC、PyRcc)详细教程来了

Qt是常用的用户界面设计工具,而在Python中则使用PyQt这一工具包,它是Python编程语言和Qt库的成功融合。这篇博文通过图文详细介绍在PyCharm中如何完整优雅地安装配置PyQt5的所有工具包,主要内容包括PyQt5、PyQt5-tools的依赖包安装和Qt Desig…