ThreeJs模拟工厂生产过程三

        上节课绘制了车间模型,但是车间里只有一条产线,这节把产线多铺设几条,放满整个车间,但是随着放满车间吗,也就意味着要创建更多的模型,而更多的模型会导致浏览器卡顿,所以这个节讲如何做模型合并,模型合并不是简单的创建group,把模型放到group中,这样只是把模型分组,但还不是给模型合并,模型合并是吧多个模型合并成一个模型。

        首先接着上面的代码,首先打开性能检测功能:需要引入stats,在创建场景中加到页面body中,并在initAnimate中实时更新stats的FPS的值,

import Stats from 'three/addons/libs/stats.module.js';
initScene(){//初始化场景this.scene = new THREE.Scene();//创建场景//创建坐标辅助const axesHelper = new THREE.AxesHelper( 100 );axesHelper.position.set(0,0,0)this.scene.add( axesHelper );//创建性能监控this.stats = new Stats();document.body.appendChild(this.stats.domElement);},initAnimate() {//创建动画this.stats.update();requestAnimationFrame(this.initAnimate);this.renderer.render(this.scene, this.camera);if(this.boxList.length>0){this.boxList.forEach(item=> {if (item.position.x > this.begin.x+this.conveyor.lang) {item.position.x = this.begin.x;} else {item.position.x += 0.1}});}},

一条产线的时候,FPS基本都是60左右,下面复制产线,这里给产线做5次循环,每次都会生成设备,传送带等,

initMachine(){ // 初始哈设备for (let i = 0; i < 5; i++) {for (let i = 0; i < this.machineList.length; i++) {let geometry = new THREE.BoxGeometry(15,15,20);//创建一个几何体let material = new THREE.MeshBasicMaterial({color:'#CCCCCC'});//创建材质let box = new THREE.Mesh(geometry, material);//创建网格模型box.position.set(this.begin.x+20+35*i,this.begin.y,this.begin.z)this.initMachineName(this.begin.x+20+35*i,this.begin.y,10,this.machineList[i])this.initConveyor(this.begin.x+(this.conveyor.lang/2),this.begin.y,this.begin.z,6,this.conveyor.lang);//前三个参数是xyz,后面两个一个是传送带宽度,一个是传送带长度this.scene.add(box);//添加到场景中}this.begin.y = this.begin.y +60}},

此时可以看到FPS只有16了,且拖动的时候明显有了卡顿的现象,此时打印模型个数:2371

分析页面,主要卡顿的原因是传送带的模型比较多,因为中间每个圆柱都是一个单独的模型,所以下面针对传送带的圆柱进行模型合并,

后弦要引入mergeGeometries,他是Threejs提供的合并组件,引入后,将原有的模型更新变换矩阵并应用,然后统一添加到一个模型数组中,最后再用这个mergeGeometries方法合并模型数组,最后生成一个新的模型并加入到场景中。代码如下,最终实现每个传送带中的圆柱形合并为一个模型,

import { mergeGeometries } from 'three/examples/jsm/utils/BufferGeometryUtils'
let cylinderList = []let lineX = x - conveyorLength/2 +1;const cylinderMaterial = new THREE.MeshLambertMaterial({color:'#d3d3d3',metalness: 0.5,transparent: false,});for (let i = 0; i < conveyorLength/3; i++) {const cylinderGeometry = new THREE.CylinderGeometry(0.5, 0.5, width, 32); // 创建圆柱体几何体 参数依次为:半径, 顶部半径, 高, 侧面分段数const cylinderMesh = new THREE.Mesh(cylinderGeometry, cylinderMaterial);// 使用几何体和材质创建圆柱体网格cylinderMesh.position.set(lineX+(i*3),y,z);cylinderMesh.updateMatrix();//更新模型变换矩阵let cylinder = cylinderMesh.geometry.applyMatrix4(cylinderMesh.matrix);//启动并应用变换矩阵cylinderList.push(cylinder);//添加到模型数组中}const bayGeometry = mergeGeometries(cylinderList);//合并模型数组let bayModelList = new THREE.Mesh(bayGeometry, cylinderMaterial);//生成一整个新的模型this.scene.add(bayModelList);

此时的FPS又恢复到了60,此时再次打印模型个数:

现在只有181个了,缩减了十倍多,不过并非所有的模型都可以合并在一起,因为合并后的模型属于同一个模型,没办法获取单个模型的位置,也没办法对单个模型进行交互,所以一般会把一个独立模型的多个部件合并在一起,以提供性能。 在稍微复杂的数字孪生场景中,模型合并是个非常重要的操作,因为直接关系到用户体验的问题。

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

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

相关文章

linux 下如何确定驱动是否已经正常加载了

1.系统日志 嵌入式系统&#xff0c;使用dmesg 指令&#xff0c;如&#xff1a; # dmesg | grep usb [ 0.253890] usbcore: registered new interface driver usbfs [ 0.253951] usbcore: registered new interface driver hub [ 0.254026] usbcore: registered new …

Python | Leetcode Python题解之第48题旋转图像

题目&#xff1a; 题解&#xff1a; class Solution:def rotate(self, matrix: List[List[int]]) -> None:n len(matrix)# 水平翻转for i in range(n // 2):for j in range(n):matrix[i][j], matrix[n - i - 1][j] matrix[n - i - 1][j], matrix[i][j]# 主对角线翻转for …

Python400集 视频教程,手把手带你零基础手写神经网络!!

嗨喽&#xff0c;大家好&#xff0c;今天又要给大家整一波福利了&#xff01; 学习编程&#xff0c;最忌讳就是今天一个教程&#xff0c;明天一个教程&#xff0c;频繁更换教程&#xff0c;增加自己的学习成本&#xff0c;对于新手小白会是一件严重打击自信心的事情。所以今天…

【嵌入式经验积累】锂电池与充电

文章目录 警告锂电池的基本参数锂电池的材料锂电池的充电阶段预充电恒流充电恒压充电复充电锂电池的充电温度范围锂电池的放电温度范围锂电池充电芯片警告 以下警告是由国内一家锂电池厂商告知的: 锂电池只有过充和过热才会爆炸(非外力)。所以一定要保证锂电池在充电过程中不…

Jmeter实现参数化的四种方法

目录 一、CSV Data Set Config/CSV数据文件设置 二、函数助手 1、Random函数 2、RandomString随机字符串 3、CSVRead 4、time 5、UUID 三、计数器&#xff08;Counter&#xff09; 参数化&#xff1a;自动化测试脚本的一种常用技巧&#xff0c;事先准备好数据&#xff…

四川尚熠电子商务有限公司抖音电商新势力的崛起

在当下这个数字化高速发展的时代&#xff0c;电子商务已经成为推动经济增长的重要引擎之一。四川尚熠电子商务有限公司&#xff0c;作为一股新兴的电商力量&#xff0c;专注于抖音电商服务&#xff0c;凭借其独特的市场洞察力和创新精神&#xff0c;正逐步在激烈的市场竞争中崭…

portaudio 怎么调用获取输出流

PortAudio是一个跨平台的音频I/O库&#xff0c;它允许你访问计算机的音频硬件进行录音和播放。要使用PortAudio获取输出流&#xff08;播放流&#xff09;&#xff0c;你需要遵循以下步骤&#xff1a; 官方下载地址&#xff1a;PortAudio - an Open-Source Cross-Platform Audi…

安全评估报告 项目安全风险评估报告 信息安全评估报告

一、安全评估报告的意义 安全评估报告是对特定环境、设施或系统安全性进行全 面分析、评估和预测的重要工具。它通过对潜在风险的识别、分析和评价&#xff0c;帮助决策者了解当前安全形势&#xff0c;制定科学的安全策略&#xff0c;从而有 效预防和减少安全事故的发生。安全…

Linux 系统IO函数之open函数

open函数 要点&#xff1a; int open(const char *pathname, int flags); perror函数 close函数 控制台输入&#xff1a; man 2 open2 表示第二章&#xff08;Linux系统IO函数位于第二章&#xff09;&#xff0c;第三章是标准C库的一些函数部分输出&#xff1a; 1、open函数返…

【ruoyi-vue】axios的封装理解和基本使用

axios的配置 ruoyi的前端对axios进行了封装&#xff0c;让我们发get请求或者是post请求更加方便了。 ruoyi对axios的封装在下面文件中&#xff1a;打开文件&#xff0c;可以看到它有三个显眼的方法&#xff0c;分别是request拦截器、response拦截器和通用下载方法。ruoYi接口地…

RK3588构建ubuntu22.04根文件系统

前言 RK系列的平台提供了buildroot和debian的系统&#xff0c;使用脚本可以直接构建出来&#xff0c;但是没有提供ubuntu的系统&#xff0c;很多厂商只提供一个rootfs.img的固件包&#xff0c;没有将方法开源出来。本文实现了从ubuntu官网开始构建一个ubuntu22.04根文件系统。…

程序员副业项目快速验证最小MVP

最小可行产品和产品市场契合 上次我们讲解了如何通过商业模式画布来规划商业逻辑&#xff0c;但是「所有的战略和规划都是基于假设」&#xff0c;只有经过验证的认知才是可靠、可信的。因此&#xff0c;接下来我们需要通过实验的方式来验证这些假设。 通常&#xff0c;我们会采…

【信息收集】端口扫描masscan负载均衡识别lbd

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、什么是masscan masscan在kali系统上是自带的端口扫描…

数据结构与算法学习笔记一---线性表的实现(C语言)

目录 2.线性表的实现 1.线性表的顺序存储表示 1.定义 2.初始化 3.判断是否为空表 4.求表长 5.查找 6.查询直接前驱节点 7.查询直接后继节点 8. 插入顺序表插入 9.删除节点 10.遍历顺序表 11.完整代码 2.线性表的链式存储表示 1.定义 2.初始化 3.判断是否为空表…

用Redis实现获取验证码,外加安全策略

安全策略 一小时内只能获取三次&#xff0c;一天内只能获取五次 Redis存储结构 代码展示 import cn.hutool.core.util.RandomUtil; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.jupiter.api.Test; import org.spri…

学习笔记:Vue3(图片明天处理)

文章目录 1.概述1.1定义1.2特性1.3组合式API 2.基本用例-项目搭建3.项目目录介绍3.1概述3.2查看文件 4.组合式API4.1概述4.2新的API风格4.2.1概述4.2.2写法4.2.3基本用例-Setup选项使用4.2.4基本用例-语法糖写法&#xff08;重点&#xff09;4.2.5执行时机4.2.6代码特点 4.3响应…

我的读书摘记《点燃孩子的学习动力:关于儿童学习兴趣的真相》

德韦克认为乔丹的经历揭示了那些最卓越的学习者身上的一个秘密&#xff1a;人的天赋&#xff0c;是可以不断发展的&#xff01;不管早期的天赋如何&#xff0c;人终将不断超越自己&#xff0c;发展自己的天赋。 思维方式决定了学习的成功与否&#xff01;这也意味着&#xff0…

【数据结构】三、栈和队列:5.顺序队列(循环队列)(初始化,判空判满,入队,出队,实例)

文章目录 队列Queue逻辑结构物理&#xff08;存储&#xff09;结构基本操作1.顺序队列&#xff08;循环队列&#xff09;1.1初始化1.2判空&判满1.2.1判空1.2.2判满方案一方案二方案三 1.3入队循环队列 1.4出队1.5获取队头元素1.6获取队列元素个数❗1.7循环队列c实例 队列Qu…

安卓Activity的setContentView()流程分析

目录 前言一、Activity的视图加载过程1.1 视图结构1.2 流程分析1.2.1 Activity.java -->setContentView()1.2.2 Activity.java -->getWindow()1.2.3 PhoneWindow.java -->setContentView()1.2.4 PhoneWindow.java --->installDecor()1.2.4.1 PhoneWindow.java ---&…

SD-WAN怎样保障网络稳定

随着企业网络的日益复杂&#xff0c;如何确保线路的稳定性和高效性成为了网络管理的一大挑战。尤其是在线路出现故障、质量下降或拥塞时&#xff0c;如何快速响应并切换到最佳线路&#xff0c;就显得尤为重要。SD-WAN&#xff0c;作为一种新型的网络架构&#xff0c;为用户提供…