ThreeJs模拟工厂生产过程八

news2024/11/24 15:29:19

        这节算是给这个车间场景收个尾,等了几天并没有人发设备模型给我,只能自己找了一个凑合用了。加载模型之前,首先要把货架上的料箱合并,以防加载模型之后因模型数量多出现卡顿,方法和之前介绍的合并传送带方法相同,代码如下:

 //初始化料箱
    initCube(){
      let cubeList = [];
      const textureLoader = new THREE.TextureLoader();
      let texture = textureLoader.load("/static/images/box.png",)
      const material = new THREE.MeshBasicMaterial({map: texture});
      for(let q=0; q<this.shelfList.length;q++){
        for(let i=0;i<this.layerNum;i++){
          for(let j=0;j<this.columnNum;j++){
            let x = this.shelfList[q].positionX;
            let y = this.shelfList[q].positionY + 2 + j * (this.plane.planeLength / 3)
            let z = this.shelfList[q].positionZ + i * (this.holder.holderHeight + this.plane.planeHeight)-9
            cubeList.push(this.addCube(x - 2, y, z));
            cubeList.push(this.addCube(x + 2, y, z));
          }
        }
      }
      const bayGeometry = mergeGeometries(cubeList);//合并模型数组
      let cubeModelMesh = new THREE.Mesh(bayGeometry, material);//生成一整个新的模型
      this.scene.add(cubeModelMesh);
    },
    //新增料箱
    addCube(x,y,z){
      let geometry = new THREE.BoxGeometry(3,3,2)
      let material = new THREE.MeshBasicMaterial({color: 0x00ff00});
        let mesh = new THREE.Mesh(geometry, material);
        mesh.position.set(x,y,z);
        mesh.updateMatrix();//更新模型变换矩阵
        return mesh.geometry.applyMatrix4(mesh.matrix);//启动并应用变换矩阵
    },

        然后开始替换模型。首先我们下载好模型放到本地,我下载的是gltf的格式,之前用引入人的模型已经导入此组件,不用再次导入了,我们只需要在绘制模型的外面加载模型,并在循环中克隆加载到的模型,并根据模型的大小进行缩放和位置偏移。为了方便查看替换过程,我把for循环分开写了。代码如下:

initMachine(){ // 初始哈设备
      this.initPerson(this.begin.x,this.begin.y,this.begin.z);
      const loader = new GLTFLoader()
      let addressY = this.begin.y
      loader.load("/static/models/device/scene.gltf", (gltf) => {
        let machine =  gltf.scene
        machine.scale.set(0.08,0.08,0.8)
        machine.rotation.x = Math.PI/2
        machine.rotation.y = Math.PI/2
        for (let i = 0; i < 5; i++) {
          for (let i = 0; i < this.machineList.length; i++) {
            let temp = machine.clone();
            temp.position.set(this.begin.x+20+45*i,addressY+2,this.begin.z-10)
            this.scene.add(temp);//添加到场景中
          }
          addressY = addressY +60
        }
      })
      for (let i = 0; i < 5; i++) {
        for (let i = 0; i < this.machineList.length; i++) {
          this.initMachineName(this.begin.x+20+45*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.addWarning(this.begin.x-5,this.begin.y,this.begin.z-9,2,30);//添加警戒线
        }
        this.begin.y = this.begin.y +60
      }
    },

这样我们就得到这样的效果

        总的来说比之前好看一些了,但是数字孪生的场景是为了模拟真实情况并查看数据的,所以我们要给设备加点数据才行,之前用了精灵组件简单的做了个设备工序名,这里为了显示更复杂的样式引用CSS2DRender,他的好处是可以做一个html的div显示在设备上,样式与原生的方法一样,这样就可以设置好看的标签样式了。

首先我们需要引入两个组件CSS2DRenderer, CSS2DObject,然后我们用js创建一个div,并根据自己的需求做一个好看的div样式和数据,然后把div塞到CSS2DObject中,并设置这个对象的位置,然后加载到场景中。

 const earthDiv = document.createElement('div');
      earthDiv.className = "label";
      earthDiv.innerHTML = "<div style='border:1px #FFFFFF solid;border-radius: 3px;'>" +
          "<span style='font-size: 12px;'>"+machine.name+"</span><br/>" +
          "<span style='font-size: 12px;'>PASS:100 个</span><br/>" +
          "<span style='color:red;font-size: 12px;'>NG:2 个</span>" +
          "</div>";
      const earthLabel = new CSS2DObject(earthDiv);
      earthLabel.position.set(x,y,z);//相对于父级元素的位置
      this.scene.add(earthLabel);

      this.labelRenderer = new CSS2DRenderer();
      this.labelRenderer.setSize(window.innerWidth, window.innerHeight);
      document.body.appendChild(this.labelRenderer.domElement)

不过要注意的是这个CSS2DObject需要用CSS2DRenderer才能渲染,所以我们需要再创建CSS2DRenderer渲染器,并放到控制器和动画绘制中,保证CSS2DObject能够正常渲染

 this.labelRenderer = new CSS2DRenderer();
      this.labelRenderer.setSize(window.innerWidth, window.innerHeight);
      document.body.appendChild(this.labelRenderer.domElement)
      //设置样式
      this.labelRenderer.domElement.style.position = 'fixed';
      this.labelRenderer.domElement.style.top = '0px';
      this.labelRenderer.domElement.style.left = '0px';
      this.labelRenderer.domElement.style.zIndex = '10';//设置层级

this.controls = new OrbitControls(this.camera, this.labelRenderer.domElement);//创建控制器

 this.labelRenderer.render(this.scene,this.camera);

我们可以看下效果

我审美有限,大家可以根据需求和选择适合的模型和绘制更美观的标签Label,完整效果如下:

车间视频end

整个生产车间的数字孪生就到这里,需要源码的可以在评论区给我留下邮箱地址,我发给你,如果觉得有哪里不足的地方也可以给我留言,可以根据需求后续再添加章节完善这个场景。

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

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

相关文章

【C++初阶】string

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

echarts tooltip 内容太多,超出范围显示不全问题,亲测有效

参考文章&#xff1a;echarts tooltip显示不全问题 在项目里面的tooltip数据特别多&#xff0c;显示不全问题&#xff08;有下面几种方法&#xff0c;选择最适合自己的&#xff09;&#xff1a; 1、如果盒子还够大&#xff0c;只是tooltip飘到上面或者下面被覆盖住了&#xff…

一文解读 SQL 生成工具

SQL 生成工具可用于测试 Parser 与其他数据库产品的兼容性&#xff0c;通过解析 YACC 语法文件中的产生式&#xff0c;生成对应的 SQL 语句&#xff0c;再使用数据库执行该 SQL&#xff0c;根据结果判断语句是否与其他数据库语法兼容。 01工具使用 语法文件预处理 预处理目的…

13 Linux实操篇-网络配置

第十三章 Linux实操篇-网路配置 13.1 Linux 网络配置原理图 13.2 查看网络IP 和网关 子网ip 与网关 13.3 查看Windows 中 VMnet8 和 Linux 的网络配置 查看Windows 中 VMnet8&#xff1a;ipconfig Linux 的网络配置: ifconfig 13.4 ping 测试主机之间网络连通性 基本语法&a…

教育装备展火热开幕,锐捷网络用科技力量点亮教育未来之光

了解教育装备行业发展新趋势、感受教育装备领域创新脉动。4月19日,一场汇聚智慧与创新的教育行业盛会——第 83 届中国教育装备展示会在山城重庆隆重启幕。位于N4013号的锐捷网络展位不仅汇聚了极简以太全光3.X、三擎云桌面2.X、极简教育城域网等前沿科技方案,更通过样机展示、…

ssl证书是怎么实现数据加密传输的?原理是什么?

SSL证书实现数据加密传输的过程大致可以分为以下几个步骤&#xff1a; 1. 握手阶段&#xff1a; - 客户端请求连接&#xff1a;当用户尝试访问一个HTTPS网站时&#xff0c;浏览器&#xff08;客户端&#xff09;会向服务器发起一个HTTPS请求&#xff0c;请求建立一个安全连接。…

通过iMock学习Jvmsandbox

Jvm-sandbox Jvm-sandbox基于Jvm-sandbox的Mock平台iMockiMock的工程学习iMock怎么写的&#xff08;sandbox的module应该怎么写&#xff09; Jvm-sandbox Jvm-sandbox是阿里开源的一款java的沙箱&#xff0c;看网上的介绍在沙箱里你可以做你能想到的奇妙的事情。 基于Jvm-san…

图题目:可以到达所有点的最少点数目

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;可以到达所有点的最少点数目 出处&#xff1a;1557. 可以到达所有点的最少点数目 难度 4 级 题目描述 要求 给定一个有向无环图&#xff0c;包含编…

Web3与智能合约:科技革新下的新金融时代

在当今数字化时代&#xff0c;Web3和智能合约正在共同塑造着金融领域的未来。Web3作为下一代互联网的重要组成部分&#xff0c;以其去中心化、安全性和透明性为核心特点&#xff0c;正推动着金融行业向着数字化和去中心化的方向发展。而智能合约作为Web3技术的关键应用之一&…

如何将本地项目上传到Github(SSH方式)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

OSPF基本配置

原理概述 OSPF 是一种应用非常广泛的基于链路状态的动态路由协议&#xff0c;它具有区域&#xff08; Area )化的层次结构&#xff0c;扩展性好&#xff0c;收敛速度快&#xff0c;适合部署在各种规模的网络上。 在 OSPF 中&#xff0c;每台路由器都必须有一个 Router-I…

在线商城客服系统,多用户电商系统可API对接客服软件

在当今数字化时代&#xff0c;在线商城客服系统和多用户电商系统之间的无缝API对接已成为电商行业的重要趋势。这种整合为商家提供了更高效的客户服务和管理方式&#xff0c;提升了用户体验和业务效率。其中&#xff0c;商淘云电商客服系统作为一款强大的客服管理工具&#xff…

Java Swing游戏开发学习26

内容来自RyiSnow视频讲解 这一节讲的是Inventory背包&#xff0c;类似RPG游戏中人物角色放置装备、药品、武器、宝石等物品的一个若干行若干列的表格窗口。 可以显示装备物品&#xff0c;并选择它们。 前言 作者说这一节可能是第二部分里面爬起来最高的山峰。 效果 最后还有…

Unity3d 学习之按钮绑定事件

创建测试脚本 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class myTest : MonoBehaviour {// Start is called before the first frame updatepublic Button _codeBindBtn null;void Start(){if (_codeBi…

IC设计数据传输 如何能保障安全高效?

IC&#xff08;集成电路&#xff09;设计数据&#xff0c;对于IC设计企业来说&#xff0c;其重要性不言而喻。所以IC设计数据传输过程中&#xff0c;其安全性和效率&#xff0c;也需要有保障。 首先我们来看看IC设计数据为什么重要&#xff0c;其重要性体现在多个方面&#xff…

远距离、高品质、低延迟、高保真——SA316无线音频模块带您探索新的音频体验

SA316系列产品分为发射端模块SA316S-TX,SA316F30和接收端模块SA316-RX&#xff0c;该系列方案采用了无线高品质的语音传输芯片来设计&#xff0c;它可以支持外部 PCM / IIS 双模数字音频接口&#xff0c;同时模块为客户提供了标准化的串行接口&#xff0c;使用者可通过串口指令…

C语言基础:初识指针(二)

当你不知道指针变量初始化什么时&#xff0c;可以初始化为空指针 int *pNULL; 我们看NULL的定义&#xff0c;可以看出NULL是0被强制转化为Void* 类型的0&#xff1b;实质还是个0&#xff1b; 如何避免野指针&#xff1a; 1. 指针初始化 2. 小心指针越界 3. 指针指向空间…

算法工程师——算法岗的分类及要求汇总

算法岗工程师 根据 Talent Seer 人才报告显示,全球 AI 从业者总人数约有 30 万,还是供不应求,其中 AI 技术专家(具有相关领域博士学位及 3 年以上工作经验的)约有 3.65 万。 简介 对于计算机专业的毕业生而言,算法岗基本上就是 「高薪」 的代名词。 在当今 IT 行业,算…

vue3.2+vite+unocss原子化配置

1、安装unocss&#xff1a;npm install unocss 2、vite.config.ts中配置&#xff1a; 3、创建unocss自己的ts文件&#xff1a;uno.config.ts 根路径下创建&#xff0c; 4、在创建好的uno.config.ts文件中编写如下代码&#xff1a; // uno.config.ts import {defineConfig,prese…

如果把软路由的网段更换成169.254.0.0/16会咋样?

前言 这几天有小伙伴在折腾软路由系统&#xff0c;然后问题就来了。 他咨询的是&#xff1a;为啥电脑连接软路由之后&#xff0c;无法访问软路由的管理页&#xff1f; 嗯。。。确实不是什么大事。但不注意看&#xff0c;还以为软路由没有正常获取到ip。 熟悉网络的小伙伴们都…