ThreeJs模拟工厂生产过程三

简介: 这篇文章介绍了在Three.js中通过使用mergeGeometries技术来合并大量车间模型,以减少浏览器渲染负担,提高性能,并提供了实现模型合并的具体方法和步骤。

上节课绘制了车间模型,但是车间里只有一条产线,这节把产线多铺设几条,放满整个车间,但是随着放满车间吗,也就意味着要创建更多的模型,而更多的模型会导致浏览器卡顿,所以这个节讲如何做模型合并,模型合并不是简单的创建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个了,缩减了十倍多,不过并非所有的模型都可以合并在一起,因为合并后的模型属于同一个模型,没办法获取单个模型的位置,也没办法对单个模型进行交互,所以一般会把一个独立模型的多个部件合并在一起,以提供性能。 在稍微复杂的数字孪生场景中,模型合并是个非常重要的操作,因为直接关系到用户体验的问题。

相关文章
|
编解码 IDE 算法
2023年电赛---运动目标控制与自动追踪系统(E题)发挥题思路
2023年电赛---运动目标控制与自动追踪系统(E题)发挥题思路
598 0
|
6天前
ThreeJs模拟工厂生产过程六
这篇文章详细介绍了如何在Three.js中模拟工厂生产过程的第六部分,重点是创建和实现车间内线边仓货架的三维模型及其布局。
11 1
ThreeJs模拟工厂生产过程六
|
6天前
ThreeJs模拟工厂生产过程二
这篇文章详细介绍了如何使用Three.js创建一个模拟工厂车间的3D模型,包括绘制地面和墙面的具体步骤,并特别关注于如何创建带有门的墙面以增加车间的真实性。
16 5
|
6天前
ThreeJs模拟工厂生产过程一
这篇文章详细介绍了如何使用Three.js模拟工厂生产过程的第一部分,包括创建传送带、生产设备和产品的模型,并实现产品沿传送带移动的动画效果。
15 5
|
6天前
ThreeJs模拟工厂生产过程四
这篇文章详细说明了如何在Three.js中为模拟的工厂产线添加警戒线,以增强产线模型的真实感和安全性表现,通过使用`PlaneGeometry`来创建并定位这些警戒线。
10 1
|
6天前
ThreeJs模拟工厂生产过程七
这篇文章详细介绍了如何在Three.js中为工厂车间的货架动态生成并放置货物,通过循环逻辑和贴图应用使货架上的物品更加逼真,增强了场景的真实感。
9 0
|
6天前
|
程序员 图形学
ThreeJs模拟工厂生产过程五
这篇文章详细介绍了如何在Three.js中模拟工业生产过程的第五部分,重点在于添加并实现车间内人物的动态行走动画,使人能够在车间内来回移动,增加了场景的真实感。
16 0
|
6天前
|
JavaScript
ThreeJs模拟工厂生产过程八
这篇文章详细介绍了如何在Three.js中模拟工厂生产过程的第八部分,重点是优化场景中的模型,包括合并货架上的料箱以减少渲染负担,并替换设备模型以增强场景的真实性和互动性。
21 0
|
4月前
经验大分享:QML动态标注线
经验大分享:QML动态标注线
22 0
|
5月前
|
设计模式 安全 Java
老系统重构系列--如何用一套流程接入所有业务线
**摘要:** 本文介绍了老系统改造的过程,作者提出,ToB业务的挑战在于需要支持多种差异化的业务需求,而模板模式在处理这种需求时可能会导致继承关系复杂和粒度过粗。为了解决这些问题,文章提出了以下步骤: 1. **梳理流程差异点**:识别不同业务流程的差异,以便确定扩展点。 2. **领域模型梳理**:区分核心域和支撑域,确保核心域的稳定性。 3. **二次抽象隔离层**:创建隔离层,避免核心域因新业务接入而变得不稳定。 4. **基于SPI的扩展体系建设**:选择了COLA-SPI实现扩展点,允许业务域定义接口并实现差异化的流程逻辑。
108 0