当前位置: 首页 > news >正文

十四、vue3项目如何使用three.js

       近期在开发过程中,因为项目已经接近尾声,就需要对项目中的数据进行整合,而数据看板不失为一个比较直观的展现形式。在数据看板中3D的展现形式是比较流行的展现形式,那么如何在项目引入一个大的场景,并且能够和后台发生交互呢。

        我们首先想到的肯定是大型团队都使用的ue4(虚幻)和unity3d,但是在没有个专门的团队的帮助下,谈这些技术都是扯,最后我还是决定使用three.js这个技术,虽然有一定的上手难度,但是最起码前端配合ui就能玩的转一些小的场景。

        我使用的是vue3项目的vben框架,如果有不同的前端技术我想差别应该不大。

        一、项目位置

        我想我们的项目位置在src/components/Scene创建一个vue页面用于展示页面,在需要展示的地方引入该页面即可

 

       二、首先我们来看一下threejs运行的四个条件

        scene场景、renderer渲染器、camera相机、object对象在我的项目中是是如何使用的呢

来看具体代码

<script lang="ts" setup>import { onMounted, onUnmounted, ref, watch } from 'vue';// 导入场景import scene from '/@/threes/scene';//相机import cameraModule from '/@/threes/camera';// 导入控制器import controls from '/@/threes/controls';// 导入辅助坐标轴import axesHelper from '/@/threes/axesHelper';// 导入渲染器import renderer from '/@/threes/renderer';// 初始化调整屏幕import '/@/three/init';// 导入添加物体函数import createMesh from '/@/threes/createMesh';// 导入每一帧的执行函数import animate from '/@/threes/animate';//绑定交互事件import eventHub from '/@/utils/eventHub';// 场景元素divlet sceneDiv = ref(null);// 添加相机scene.add(cameraModule.activeCamera);// 添加辅助坐标轴// scene.add(axesHelper);// 创建物体createMesh();// 创建事件的问题const props = defineProps(['eventList']);const onmousedown = (e) => {eventHub.emit('mouseDown', e);};onMounted(() => {sceneDiv.value.appendChild(renderer.domElement);addEventListener('click', onmousedown, false);animate();});watch(() => props.eventList,() => {console.log('触发事件列表更新2');eventHub.emit('setEventList', props.eventList);},{ deep: true },);onUnmounted(() => {console.log('销毁');removeEventListener('click', onmousedown, false);// removeEventListener('mousedown', onmousedown, false);});
</script>

scene.js文件主要创建了一个场景,并添加了平行光,当然天气等条件都能加入进来

import * as THREE from 'three';
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';
// 初始化场景
const scene = new THREE.Scene();// 添加雾霾
// const fog = new THREE.Fog(0x000000, 0, 1000);
// scene.fog = fog;// 导入hdr纹理
const hdrLoader = new RGBELoader();
hdrLoader.loadAsync('./textures/023.hdr').then((texture) => {scene.background = texture;scene.environment = texture;scene.environment.mapping = THREE.EquirectangularReflectionMapping;
});// 添加平行光
const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(10, 100, 10);
scene.add(light);export default scene;

cameraModule.js文件主要设置了相机的位置,新增相机和切换相机的方法,当然这个的命名是根据你的场景里相机的位置来决定的

import * as THREE from 'three';
import eventHub from '/@/utils/eventHub';
// 创建透视相机
const camera = new THREE.PerspectiveCamera(75, window.innerHeight / window.innerHeight, 1, 100000);
// 设置相机位置
camera.position.set(10, 80, 0);
class CameraModule {constructor() {this.activeCamera = camera;this.collection = {default: camera,};eventHub.on('toggleCamera', (name) => {this.setActive(name);});}add (name, camera) {this.collection[name] = camera;}setActive (name) {this.activeCamera = this.collection[name];}
}
export default new CameraModule();

renderer.js渲染器主要是设置了webGL的一些参数,使你的场景不那么假

import * as THREE from 'three';
// 初始化渲染器
const renderer = new THREE.WebGLRenderer({// 设置抗锯齿antialias: true,// depthbufferlogarithmicDepthBuffer: true,physicallyCorrectLights: true,alpha: true,
});
// 设置渲染尺寸大小
// renderer.setSize(window.innerWidth, window.innerHeight);
setTimeout(() => {const container = document.getElementById('sceneDiv');renderer.setSize(container.offsetWidth, container.offsetHeight);renderer.setClearAlpha(0);renderer.shadowMap.enabled = true;renderer.toneMapping = THREE.ACESFilmicToneMapping;renderer.toneMappingExposure = 1.5;
}, 40);export default renderer;

我的object对象的加载放在了createMesh.js这个文件里面,能够让分清他们的职责。

import scene from './scene';
import City from './mesh/City';
let city;
export default function createMesh () {// 创建城市city = new City(scene);
}export function updateMesh (time) {city.update(time);
}

当然在city.js里面我也加入了加载的方法,能让public的glb数据文件能够加载到场景中。

    this.loader.load('./screen/earth.glb', (gltf) => {scene.add(gltf.scene);// targetList.push(gltf.scene);// 场景子元素遍历this.gltf = gltf;this.floor1Group = gltf.scene;});

好了,基本的数据结构就是这样的,那么就让我们来看看实际的效果图吧

     

 希望对大家学习使用three.js有用,有什么不懂的都可以问我哦

相关文章:

十四、vue3项目如何使用three.js

近期在开发过程中&#xff0c;因为项目已经接近尾声&#xff0c;就需要对项目中的数据进行整合&#xff0c;而数据看板不失为一个比较直观的展现形式。在数据看板中3D的展现形式是比较流行的展现形式&#xff0c;那么如何在项目引入一个大的场景&#xff0c;并且能够和后台发生…...

python 向excel表中添加新的sheet页或者向旧sheet中写入数据

import xlwt import xlrd from xlutils.copy import copy import os import numpy as np import pandas as pd class Excel_Add_Sheet():def save_table(self, table, file_name):# 保存表table.save(file_name)def add_new_sheet(self, file_name, sheet_name, titleNone):&q…...

RPC-grpc实践

参考&#xff1a;https://developer.aliyun.com/article/1152352?spma2c6h.12873639.article-detail.33.344f6446zEnbRi&scm20140722.ID_communityarticle1152352._.ID_communityarticle1152352-OR_rec-V_1 参考&#xff1a;https://onejson.blog.csdn.net/article/detai…...

JavaEE——MyBatis配置文件的详细介绍

简单介绍&#xff1a; 需要我们编写的配置文件主要有三个&#xff0c;分别是核心配置文件&#xff08;mybatis-config.xml&#xff09;&#xff0c;数据库连接信息文件&#xff08;db.properties&#xff09;&#xff0c;SQL语句映射文件&#xff08;Mappers&#xff09;&…...

bwmarrin/snowflake生成ID重复问题排查记录

现象 某日&#xff0c;运营反馈&#xff0c;在某个时间区间丢失了一段日志&#xff0c;让看看是什么问题。 排查 查看项目日志有无错误 发现项目日志有报错信息Error 1062 Duplicate entry 149059529550598144 for key PRIMARY,很显然&#xff0c;问题在此&#xff0c;数据库…...

操作系统题目收录(十)

1、在存储管理中&#xff0c;采用覆盖与交换技术的目的是&#xff08;&#xff09;。 A&#xff1a;节省主存空间B&#xff1a;物理上扩充主存容量C&#xff1a;提高CPU效率D&#xff1a;实现主存共享 解析 覆盖和交换的提出就是为了解决主存空间不足的问题&#xff0c;但不…...

IOS 自动化测试环境搭建

购买MacPDD 比TB JD 便宜500&#xff0c;下单安装homebrew/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"安装npm cnpmbrew install node; npm install -g cnpm --registryhttps://registry.npm.taobao.org;安装类似Andro…...

系统设计原则

系统设计原则 好的系统是迭代出来的。先解决核心问题&#xff0c;预测未来可能出现的问题&#xff0c;对现有的问题有方案&#xff0c;对未来的问题有预案。不是一上来就按1亿用户量设计&#xff0c;也不要过度复杂化系统。 业务千变万化&#xff0c;技术层出不穷&#xff0c…...

推荐130个网站,非常实用,比涨工资都重要

搞学习 TED&#xff08;最优质的演讲&#xff09;&#xff1a;https://www.ted.com/ 谷粉学术&#xff1a;https://gfsoso.99lb.net/scholar.html 大学资源网&#xff1a;http://www.dxzy163.com/ 简答题&#xff1a;http://www.jiandati.com/ 网易公开课&#xff1a;https…...

手机棋牌游戏开发的流程是怎样的?

最近几年&#xff0c;随着网络游戏的兴起&#xff0c;棋牌手游开发也越来越受欢迎&#xff0c;在国内&#xff0c;几乎随处可见从事手游和手游的公司。不过&#xff0c;虽然公司和产品很多&#xff0c;但效果也不一样&#xff0c;区别就在于&#xff0c;他们能不能掌握好这款游…...

浅谈C++函数重载

C相较于C语言来说,重载是一重大特性,让我们一起简单的回顾一下重载那些事 传送门函数重载是什么为什么有函数重载函数重载是如何实现的总结函数重载是什么 函数重载:是函数的一种特殊情况,C允许在同一作用域中声明几个功能相似的同名函数 这些同名函数的形参列表(参数个数or类…...

数据分析spss应急考试

数据分析spss应急考试 前言 单项选择 15(项)*2&#xff08;分&#xff09;30 判断题 10*1 10 计算题 2*10 案例分析题目(考实验内容) 总四十分&#xff0c;分值不等 老师重点强调了回归分析因子分析方差分析参数、非参数检验 2独立样本的非参数检验应该用什么方法多独立样本…...

Handler postDelayed的实现原理

Handler postDelayed的实现原理 问题描述 Handler.postDelayed()的原理是如何保证延时执行的&#xff1f; 扩展&#xff1a;这样实现的好处是什么&#xff1f; 题目分析 猜测一下 以我们对Handler的了解&#xff0c;内部使用了Looper对消息队列进行循环获取执行&#xff0…...

【数据结构】平衡二叉树

目录 一、平衡二叉树的介绍 二、平衡二叉树的插入 1、平衡二叉树的插入步骤 2、平衡二叉树的旋转 2.1左单旋 2.2右单旋 2.3左右双旋 2.4右左双旋 三、平衡二叉树的删除&#xff08;略&#xff09; 四、个人对平衡二叉树见解 五、平衡二叉树整体代码 一、平衡二叉树的…...

Minecraft服务端配置

✨✨前言 ✨✨ 我的世界大家肯定都不陌生&#xff0c;在网易拿下中国区的代理后&#xff0c;很多小伙伴也是都转向了网易版我的世界&#xff0c;网易版我的世界可以说已经做是的十分全面了&#xff0c;使用起来也十分方便&#xff0c;一部分小伙伴也是看重了网易庞大的玩家数量…...

yunUI组件库解析:图片上传与排序组件yImgPro

yunUI是笔者开源的微信小程序功能库。目前其中包含了一些复杂的功能组件。方便使用。未来它将分为组件、样式、js三者合为一体&#xff0c;但分别提供。 本文所用代码皆来源于组件库中的yImgPro组件。详细代码可至github查看。地址&#xff1a; yunUI 。 npm地址&#xff1a;yu…...

Java基础:回调函数

因为在看Android代码的时候发现了许多关于回调函数的知识, 所以去了解了一下. 对于我来说不太好懂, 因为我觉得看的那些博文的讲法对我来说很绕, 所以我在理解了之后想写一篇关于回调函数的博文来给和我一样理解能力稍差的人一点帮助. 回调函数的作用其实就是将需要这个功能的调…...

Springboot多环境配置

此文章是根据黑马程序员课程所做的笔记课程视频 多环境开发 ​ 什么是多环境&#xff1f;其实就是说你的电脑上写的程序最终要放到别人的服务器上去运行。每个计算机环境不一样&#xff0c;这就是多环境。常见的多环境开发主要兼顾3种环境设置&#xff0c;开发环境——自己用的…...

Java Number Math 类,超详细整理,适合新手入门

目录 一、什么是Java Number类&#xff1f; 二、Java Number类提供了哪些基本的数字操作&#xff1f; 三、什么是包装类&#xff1f; 所有的包装类都是抽象类 Number 的子类。 四、什么是Java Math 类 Test类案例&#xff1a;&#xff08;Math.PI 表示一个圆的周长与直径…...

俯瞰·明统系列·落霞与孤鹜齐飞、南征与北伐并举

尽江南百万兵&#xff0c;腰间宝剑血尤腥。 引言 元至正二十七年&#xff08;1367年&#xff09;四月&#xff0c;吴王朱元璋命中书右丞相徐达为征虏大将军、平章常遇春为副将军&#xff0c;率军25万由淮入河、北进中原&#xff08;第一次北伐&#xff09;。北伐中发布告北方官…...

人形机器人关节驱动技术深度解析:旋转执行器的设计与应用全景

1. 旋转执行器&#xff1a;人形机器人的动力核心 当你看到人形机器人灵活地行走、挥手甚至跳舞时&#xff0c;有没有想过是什么让它们的关节能够如此精准地运动&#xff1f;答案就藏在那些不起眼的旋转执行器里。这些看似简单的装置&#xff0c;实际上是人形机器人最关键的传动…...

告别Keil?STM32CubeIDE环境搭建全记录:附JAVA安装与汉化资源指北

从Keil到STM32CubeIDE&#xff1a;嵌入式开发环境迁移实战指南 当ST官方逐渐将重心转向HAL库生态时&#xff0c;许多传统开发者正面临工具链升级的抉择。作为一款集成了STM32CubeMX功能的Eclipse-based IDE&#xff0c;STM32CubeIDE不仅代表着开发模式的转变&#xff0c;更预示…...

手把手教你给RK3588开发板添加RTL8188EUS USB无线网卡驱动(附完整配置流程)

RK3588开发板实战&#xff1a;RTL8188EUS无线网卡驱动移植全指南 在嵌入式开发领域&#xff0c;为特定硬件平台添加第三方外设驱动是开发者常遇到的挑战。本文将详细介绍如何在Rockchip RK3588开发板上为RTL8188EUS USB无线网卡移植驱动&#xff0c;从环境准备到功能验证&#…...

Mac 系统高效安装 ChatGPT 全攻略:从环境配置到性能优化

在 Mac 上折腾 ChatGPT 的安装&#xff0c;尤其是想跑个本地化的 CLI 工具或者集成到自己的项目里&#xff0c;相信不少朋友都踩过坑。原生安装方式看似简单&#xff0c;但 Python 版本管理混乱、依赖包冲突、系统权限问题&#xff0c;常常让一个简单的 pip install openai 变成…...

P1122 最大子树和

题目描述 小明对数学饱有兴趣&#xff0c;并且是个勤奋好学的学生&#xff0c;总是在课后留在教室向老师请教一些问题。一天他早晨骑车去上课&#xff0c;路上见到一个老伯正在修剪花花草草&#xff0c;顿时想到了一个有关修剪花卉的问题。于是当日课后&#xff0c;小明就向老…...

L1-083 谁能进图书馆,python解法

题目&#xff1a;为了保障安静的阅读环境&#xff0c;有些公共图书馆对儿童入馆做出了限制。例如“12 岁以下儿童禁止入馆&#xff0c;除非有 18 岁以上&#xff08;包括 18 岁&#xff09;的成人陪同”。现在有两位小/大朋友跑来问你&#xff0c;他们能不能进去&#xff1f;请…...

DAMOYOLO-S保姆级教学:Gradio自定义组件添加‘清空缓存’按钮实操

DAMOYOLO-S保姆级教学&#xff1a;Gradio自定义组件添加‘清空缓存’按钮实操 1. 引言&#xff1a;为什么需要“清空缓存”按钮&#xff1f; 如果你用过DAMOYOLO-S这个目标检测模型&#xff0c;可能会发现一个不大不小的问题&#xff1a;连续上传多张图片进行检测后&#xff…...

Wan2.2-I2V-A14B部署教程:解决端口冲突/驱动报错/加载失败全方案

Wan2.2-I2V-A14B部署教程&#xff1a;解决端口冲突/驱动报错/加载失败全方案 1. 环境准备与快速部署 1.1 硬件与系统要求 在开始部署前&#xff0c;请确保您的设备满足以下最低配置要求&#xff1a; 显卡&#xff1a;RTX 4090D 24GB显存&#xff08;必须匹配&#xff09;内…...

终极指南:如何使用Pencil Project实现实时协作原型设计

终极指南&#xff1a;如何使用Pencil Project实现实时协作原型设计 【免费下载链接】pencil The Pencil Projects unique mission is to build a free and opensource tool for making diagrams and GUI prototyping that everyone can use. 项目地址: https://gitcode.com/…...

央国企稳岗扩岗新举措解读

近日&#xff0c;国家层面再次强调了就业优先战略的重要性&#xff0c;并推动相关政策措施进一步升级。在这一宏观背景下&#xff0c;中央企业和国有企业作为国民经济的重要支柱&#xff0c;其在稳就业、扩岗位方面的举措备受关注。一系列新的行动方案正陆续出台&#xff0c;旨…...