封装一个基于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.hqwc.cn/news/208805.html

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

相关文章

VScode调试没有反应

点击调试按钮后没反应 有可能是vscode中安装的python插件版本问题 可以通过重新安装比较旧一点的python尝试解决此问题 步骤如下: 然后从中选择比当前版本更低的版本即可 安装完成后需重启vscode

汇编-pop出栈指令

32位汇编 执行动作分为两步: 第一步:读出数据 第二步:改变栈地址 如果操作数是16位, 则ESP加2; 如果操作数是32位, 则ESP加4 espesp2 或 espesp4 格式:

ios qt开发要点

目前关于ios qt的开发资料比较少,这里整理了几个比较重要的开发要点,基于MacOS14 Xcode15 Qt15.5 cmake iphone真机。 cmake报错,报错信息如下 CMake Error at /Users/user/Qt/5.15.5/ios/lib/cmake/Qt5Core/Qt5CoreConfig.cmake:91 (m…

opencv-直方图

直方图是一种对图像亮度分布的统计表示,它显示了图像中每个灰度级别的像素数量。在OpenCV中,你可以使用cv2.calcHist() 函数计算直方图。 以下是一个简单的示例,演示如何计算和绘制图像的直方图: import cv2 import numpy as np …

for 循环变量的声明方式

获取字符串中的第一个单词,for 循环中的 &value 声明比较特殊,结合图1编译器的提示,value 是一个 u8 类型。 fn get_first_world(s: &str) -> &str {let bytes s.as_bytes();for (i, &value) in bytes.iter().enumerate…

Arthas 监听 Docker 部署的java项目CPU占比高的信息

1、Linux上安装Arthas wget https://alibaba.github.io/arthas/arthas-boot.jar2、docker ps 查看目标项目的容器ID 3、copy Arthas 到目标容器中 (注意有 😕 ) docker cp arthas-boot.jar d97e8666666:/4、进入到目标容器目录中 docker exec -it d97e8666666 /b…

【VScode】安装配置、插件及远程SSH连接

一、VSCode安装 二、配置安装插件 三、配置远程连接SSH 四、MinGW 一、VSCode安装 VS官网 Visual Studio Code - Code Editing. Redefined下载安装包: 二、配置安装插件 安装中文插件 配置字体为20 配置文件–>首选项->设置->Font Size为20 设置 VSC…

git stash 用法总结

目录 1,介绍场景1:场景2: 2,常用命令2.1,基础2.2,进阶1,存储时指定备注2,通过索引来操作指定的存储3,修改存储规则 2.3,查看 stash 修改的具体内容 1&#xf…

洛谷 P4552 [Poetize6] IncDec Sequence

挺好的一道思维题。 分析 因为是对区间修改,多次修改肯定会超时,很容易想到差分。 那么原题的对区间修改就可以转换为下面三个操作(均在差分数组中): 1. 任选一个数1 2. 任选一个数-1 3. 任选两个数1和-1 进一步考…

opencv-直方图均衡化

直方图均衡化是一种用于增强图像对比度的图像处理技术。它通过调整图像的灰度级别分布,使得图像中各个灰度级别的像素分布更均匀,从而提高图像的对比度。 在OpenCV中,你可以使用cv2.equalizeHist()函数来进行直方图均衡化。 以下是一个简单…

2023.11.22 -数据仓库的概念和发展

目录 https://blog.csdn.net/m0_49956154/article/details/134320307?spm1001.2014.3001.5501 1经典传统数仓架构 2离线大数据数仓架构 3数据仓库三层 数据运营层,源数据层(ODS)(Operational Data Store) 数据仓库层&#…

redis运维(十四) hash缓存案例

一 缓存案例 ① 需求 ② 个人理解 策略:不更新缓存,而是删除缓存大部分观点认为:1、做缓存不应该是去更新缓存,而是应该删除缓存2、然后由下个请求去缓存,发现不存在后再读取数据库,写入redis缓存 高并发场景下,到底先更新缓存还是先更…