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中文网

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

二、功能说明

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);
}

未完待续。。。(下班啦,明天继续更) 

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

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

相关文章

【Web - 框架 - Vue】随笔 - Vue的简单使用 - 快速上手

【Web - 框架 - Vue】随笔 - Vue的简单使用 - 快速上手 Vue模板代码 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>模板</title> </head> <body> <div></div>…

苹果因在iOS音乐流媒体市场上的反向引导行为,在欧盟被罚款18.4亿欧元

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

day12_SpringCloud(Gateway,Nacos配置中心,Sentinel组件)

文章目录 1 Gateway组件1.1 Gateway简介1.2 Gateway入门1.3 网关路由流程图1.4 路由工厂1.5 过滤器1.5.1 过滤器简介1.5.2 内置过滤器1.5.3 路由过滤器1.5.4 默认过滤器1.5.5 全局过滤器1.5.6 过滤器执行顺序 2 Nacos配置中心2.1 统一配置管理2.2 Nacos入门2.2.1 Nacos中添加配…

进入软件测试行业,这些问题你一定要知道!

很多转行的朋友都会选择进入软件测试开发行业&#xff0c;如果确定进入软件测试开发行业&#xff0c;那么这些问题你一定要知道&#xff01; 一、软件测试发展前景 1、测试人员与开发人员的配比已经从最初的1:10、1:8&#xff0c;发展到如今的1:3、1:2。未来会继续趋于平衡&…

如何使用生成式人工智能探索视频博客的魅力?

视频博客&#xff0c;尤其是关于旅游的视频博客&#xff0c;为观众提供了一种全新的探索世界的方式。通过图像和声音的结合&#xff0c;观众可以身临其境地体验到旅行的乐趣和发现的喜悦。而对于内容创作者来说&#xff0c;旅游视频博客不仅能分享他们的旅行故事&#xff0c;还…

CTF-NetA:一款专业的CTF网络流量分析工具

# CTF-NetA&#xff1a;一款专业的CTF网络流量分析工具 ## 介绍 CTF-NetA是一款专门针对CTF比赛的网络流量分析工具&#xff0c;可以对常见的网络流量进行分析提取flag&#xff0c;软件具有UI&#xff0c;不需要使用者具备任何基础能力。 该工具支持多种协议的分析&#xff0…

[译]BNF 表示法:深入了解 Python 的语法

[译]BNF 表示法&#xff1a;深入了解 Python 的语法 原文&#xff1a;《BNF Notation: Dive Deeper Into Python’s Grammar》 https://realpython.com/python-bnf-notation/ 在阅读Python文档的时候&#xff0c;你可能已经遇到过BNF(Backus–Naur form)表示法&#xff1a; 下…

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

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

解决岗位招聘、绩效管理及员工培训问题,这样做

许多企业在发展过程中&#xff0c;会遇到一系列的管理问题&#xff0c;比如优秀人才匮乏、人才流失严重、人才素质整体水平较低等&#xff0c;这些管理问题严重影响了企业的进一步发展。如何解决这些问题成为企业管理者关注的重点。我们一起来看看华恒智信提供的针对性解决思路…

【力扣精选算法100道】——判定是否互为字符重排(哈希专题)

目录 &#x1f6a9;了解题意 &#x1f6a9;算法原理 第一种&#xff1a;排序 第二种方法&#xff1a;哈希 &#x1f6a9;实现代码 面试题 01.02. 判定是否互为字符重排 - 力扣&#xff08;LeetCode&#xff09; &#x1f6a9;了解题意 我们输入俩个字符串&#xff0c;当俩…

如何在服务器上建立国外私有云存储

随着数字化时代的到来&#xff0c;数据备份和存储成为了我们生活与工作中不可或缺的一部分。私有云存储&#xff0c;以其灵活性、安全性和便捷性&#xff0c;受到了越来越多用户的青睐。特别是对于需要在国外服务器上建立私有云存储的用户来说&#xff0c;这一需求更加迫切。下…