three.js如何实现简易3D机房?(一)基础准备-上

目录

一、tips

二、功能说明

1.模型初始化 

 2.功能交互

三、初始化准备

1.目录结构

2.创建三要素 

3.创建轨道控制器

4.初始化灯光 

5.适配

6.循环渲染


一、tips

1.three.js入门的相关基础性知识就不在此过多赘述了,可以自行提前了解

three.js docs:官网 

Three.js中文网 :有教程有案例,还有免费学习视频(当然也有收费的部分,可以根据自己情况来定,不过个人觉得看文档就够了,在实际项目中学习成长的更快),内容很多可以自行探索,对于刚接触three.js的小伙伴非常友好,有很多实用的避坑教程

2.本教程不包括如何自建机房模型,只有模型相关交互内容,(其他图表的展示是通过定位实现的,这里也不做赘述),因为项目比较小,功能交互相对也很简单,只能说是入门,最后实现的效果算是勉强看的过去,用到的模型是公司相关同事为项目量身定制的,建议可以自己找类似模型练习,个人不方便分享

相关模型下载以及学习教程地址推荐:

3D模型gltf下载网站(threejs开发) | Three.js中文网

麒跃科技_老陈打码-让学习更简单!

3.初始化部分个人全部是自己写的,单独做了封装,当然大家也可以去找一些成熟的开源项目,直接拿过来用,或者自己写不封装都行,反正能跑起来就行,哈哈哈哈~

二、功能说明

1.模型初始化 

默认显示报警设备的信息,正常设备按照顺序3s轮换展示

 2.功能交互

点击选中设备,添加选中效果并显示当前选中设备的信息

三、初始化准备
1.目录结构

此目录是我实际项目(vue3+ts)文件目录,没时间单独拆开写demo,其他多余文件自行忽略

2.创建三要素 

在threeD-init.js文件中:

// 引入three.js
import * as THREE from 'three';
export let scene, camera, renderer, width, height,// 1.初始化三要素
export function init (dom) {scene = new THREE.Scene();// 设置场景颜色scene.background = new THREE.Color(0x001c55)camera = new THREE.PerspectiveCamera(25, width / height, 1, 1000);// 移动相机位置camera.position.set(0, 0, 80);camera.lookAt(new THREE.Vector3(0, 0, 0));// 添加抗锯齿效果renderer = new THREE.WebGLRenderer({ antialias: true, logarithmicDepthBuffer: true, });// 给画布设置宽高renderer.setSize(width, height);// document.body.appendChild(renderer.domElement);dom.appendChild(renderer.domElement);
}

注意:

(1)当3D内容是全屏展示时

  width = window.innerWidth;height = window.innerHeight;document.body.appendChild(renderer.domElement);

(2)当3D内容是局部div时

  width = dom.offsetWidth;height = dom.offsetHeight;dom.appendChild(renderer.domElement);
3.创建轨道控制器

在threeD-init.js文件中:具体属性配置可参考文档根据实际开发要求调整

// 导入附加组件-轨道控制器
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
export let controls// 2.创建轨道控制器
export function createControls () {controls = new OrbitControls(camera, renderer.domElement);// 开启阻尼惯性controls.enableDamping = true;// 阻尼速度controls.dampingFactor = 0.1;// 开启旋转// controls.autoRotate = true;// 旋转的速度// controls.autoRotateSpeed = 1;// 视角最小距离// controls.minDistance = 20;// 视角最远距离// controls.maxDistance = 5000;// 最大角度controls.maxPolarAngle = Math.PI / 3;
}
4.初始化灯光 

在threeD-init.js文件中:

// 3.初始化灯光
export function initLight () {//模拟远处类似太阳的光源const directionalLight = new THREE.DirectionalLight(0xffffff, 1); directionalLight.position.set(3, 500, 10).normalize();scene.add(directionalLight);//影响整个场景的光源const ambient = new THREE.AmbientLight(0xffffff, 1);ambient.position.set(0, 500, 10);scene.add(ambient);
}
5.适配

在threeD-init.js文件中:

官网其实只给了适配浏览器大小的示例,但在实际项目中适配效果还是差了一点儿,我自己又另外加了一个监听div尺寸变化的适配,大家可以根据实际情况自行取用

// 5.1监听div的尺寸变化(是否全屏)
export const watchDom = (dom) => {let ro = new ResizeObserver(() => {updateRelatedProperties(dom)});ro.observe(dom);
};// 5.2监听浏览器窗口的缩放
export function renderResize (dom) {window.addEventListener('resize', () => {updateRelatedProperties(dom)});
}function updateRelatedProperties (dom) {getDomInfo(dom);// 更新画布宽高renderer.setSize(width, height);// 更新相机的宽高比camera.aspect = width / height;// 更新相机的近截面和远截面camera.updateProjectionMatrix();
}
6.循环渲染

在threeD-init.js文件中:

// 6.循环渲染
export function renderLoop () {requestAnimationFrame(renderLoop);// 实时更新性能controls.update();css3DRenderer.render(scene, camera);renderer.render(scene, camera);
}

接下一篇:

three.js如何实现简易3D机房?(一)基础准备-下:http://t.csdnimg.cn/TTI1P

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

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

相关文章

Pytest框架中的测试用例执行方式!

前言 本文将针对pytest的核心特性之一——测试用例的执行方式展开深入探讨,并通过详尽的实战示例展示如何在不同环境下灵活操控测试运行,同时全面解析pytest中常见的且极具实用价值的命令行选项。 一、从基础到进阶:pytest在命令行下的测试用…

苹果电脑专业的Mac垃圾清理工具CleanMyMac X4.14.7

CleanMyMac X是一款专业的Mac清理工具,它具有强大的功能和易用的界面,可以帮助用户快速清理Mac上的无用文件和垃圾,优化系统性能,提升电脑运行速度。 该软件的核心功能包括智能扫描与清理、应用程序管理、隐私保护和系统维护等。…

简单介绍SpeechPrompt、SpeechPrompt V2、SpeechGen

主要介绍SpeechPrompt、SpeechPrompt V2、SpeechGen SpeechPrompt 模型结构和原理(语音到符号) 整体思路:音频特征提取(HuBert/CPC),离散–》deep prompt speechLM(GSLM)—》概率映射–>目标Verbaliz…

代码随想录刷题笔记-Day28

1. 重新安排行程 332. 重新安排行程https://leetcode.cn/problems/reconstruct-itinerary/给你一份航线列表 tickets ,其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK(肯…

计算题--时标网络图

时标网络图相当于是双代号网络图和横道图的结合体,特点是多了虚线和波浪线〰️,虚线代表虚工作(只能竖着画),波浪线代表自由时差(横着画)。 在时标网络图中 找关键路径,没有波浪线的…

07_mdioLinux内核模块

01_basicLinux内核模块-CSDN博客文章浏览阅读316次&#xff0c;点赞3次&#xff0c;收藏3次。环境IDubuntuMakefilemodules:clean:basic.creturn 0;运行效果。https://blog.csdn.net/m0_37132481/article/details/136157384my_mdio.c #include <linux/kernel.h> #includ…

【数据结构与算法】深入浅出:单链表的实现和应用

&#x1f331;博客主页&#xff1a;青竹雾色间. &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 ✨人生如寄&#xff0c;多忧何为 ✨ 目录 前言 单链表的基本概念 节点 头节点 尾节点 单链表的基本操作 创建单链表 头插法&#xff1a; 尾插法&#…

【数据结构】 简单认识包装类与泛型

文章目录 包装类基本数据类型和对应的包装类拆箱和装箱自动装箱和自动拆箱包装类面试题 什么是泛型为什么要使用泛型泛型类的创建语法泛型类的使用语法示例类型推导(Type Inference) 裸类型(Raw Type)泛型如何编译的擦除机制为什么不能实例化泛型类型数组 泛型的上界语法示例复…

【C语言】Leetcode 876. 链表的中间节点

主页&#xff1a;17_Kevin-CSDN博客 专栏&#xff1a;《Leetcode》 题目 通过题目的要求可以判断出有两种示例要解决&#xff0c;一种是偶数节点的链表&#xff0c;一种是奇数节点的链表&#xff0c;应对这两种情况我们需要使程序对二者都可以兼容。 解决思路 struct ListNode…

03. Nginx入门-Nginx虚拟主机

Nginx虚拟主机简介 yum安装与源码安装一样&#xff0c;只是Nginx配置文件路径不一致&#xff0c;这里用的yum安装的配置文件路径。 利用虚拟主机的功能&#xff0c;可以在一台Nginx服务器上部署一个或多个虚拟主机。 虚拟主机主配置文件 注意&#xff1a;配置完成Nginx主配置…

时间序列数据平稳性检验与随机性分析

1、实验内容: 分析1964年到1999年中国纱产量的时间序列&#xff0c;主要内容包括: (1)、通过图分析时间序列的平稳性&#xff0c;这个方法很直观&#xff0c;但比较粗糙; (2)、通过计算序列的自相关和偏自相关系数&#xff0c;绘出自相关图&#xff0c;根据平稳时间序列的性质分…

splay学习笔记重制版

以前写的学习笔记&#xff1a;传送门 但是之前写的比较杂乱&#xff0c;这里重制一下 问题背景 假设我们要维护一个数据结构&#xff0c;支持插入、删除、查询某个值的排名&#xff0c;查询第 k k k大的值等操作。 最直接的想法是用二叉搜索树&#xff0c;也就是左子树权值&l…

Java实现手机库存管理

一、实验任务 编写一个程序&#xff0c;模拟库存管理系统。该系统主要包括系统首页、商品入库、商品显示和删除商品功能。每个功能的具体要求如下&#xff1a; 1.系统的首页&#xff1a;用于显示系统所有的操作&#xff0c;并且可以选择使用某一个功能。 2.商品入库功能&…

《JAVA与模式》之访问者模式

系列文章目录 文章目录 系列文章目录前言一、分派的概念二、分派的类型三、访问者模式的结构四、访问者模式的优点五、访问者模式的缺点 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网…

ACWing: 730.机器人跳跃问题

二分、递推 #include <iostream> #include <cstring> #include <algorithm> using namespace std;const int N 1e5 10; int h[N] {0};int n,maxh0; // 当 E > maxh 时一定可以满足bool check(int mid){int E mid;for(int i 1;i < n;i){E 2 *…

电商直播大屏是什么?想搞这个怎么做?

随着电商行业的快速发展&#xff0c;直播带货已成为当下最热门的市场营销方式之一。为了更好地掌握直播数据&#xff0c;为企业决策提供有力支持&#xff0c;电商直播数据大屏应运而生。 一、电商直播数据大屏概述 电商直播数据大屏是一种集成了多种数据源的大屏幕可视化展示…

【管理咨询宝藏资料33】某头部咨询公司组织效能提升模型方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏资料33】某头部咨询公司组织效能提升模型方案 【关键词】战略规划、组织效能、管理咨询 【文件核心观点】 - 通过长期行业积累和市场洞察&#…

四电极测脂模块CSU18M91开发脂肪秤方案

一台脂肪秤通过测试体重、体脂、BMI、水分等数据并给出相应提示&#xff0c;并且许多人都将体脂检测数据作为身体健康指数衡量标准&#xff0c;辅助用户来关注身体健康&#xff0c;同时可以通过蓝牙与手机APP应用相连&#xff0c;记录日常身体变化情况&#xff0c;根据变化情况…

表单验证、属性绑定(一个属性根据另一个属性有无进行操作)

表单验证 一个属性根据另一个属性有无进行操作&#xff08;属性绑定&#xff09; 1、问题描述 ​ 需求&#xff1a;表单里面后两个属性需要根据前面一个属性进行有无判断。如果前面属性没有输入值&#xff0c;则不需要进行操作&#xff1b;如果前面属性有输入值&#xff0c;则…

通过scp在两台设备之间传输文件的sh脚本

前言 因项目需要&#xff0c;需要在两台设备发送大的文件&#xff0c;使用了Libcurl和libssh 和 libsftp等库&#xff0c;发现各种文件&#xff0c;连官方的demo都有文件&#xff0c;于是想到干脆写脚本还简单一些。 环境安装&#xff1a; sudo apt-get install expect 发送&a…