ThreeJs模拟工厂生产过程一

news2024/9/21 7:31:43

        上节我们已经通过绘制两条长方体和多个圆柱体成功绘制出传送带,今天根据之前的传送带做个简单的工厂车间生产的demo,然后再不断完善它。

        首先分析下工厂生产有哪些部分组成,工厂内是产线,产线需要有设备,传送带以及生产的产品。但是为了避开建模的部分,设备可以先直接用一个长方体代替,传送带根据上节内容已经实现了,生产的产品也先用一个正方体代替,最终再做一个让产品在传送带上移动的动画就好了。首先还是要绘制场景,相机,灯光等,这部分就不放代码了,之前每个章节都有。

        我们先要绘制一条很长的传送带,贯穿整个生产线,作为产品移动的载体。代码如下

 begin: { x: 0, y: 0, z: 0 },
initConveyor(x,y,z,width,conveyorLength){ //初始化传送带
      //初始化传送带
      let geometryLeft = new THREE.BoxGeometry(conveyorLength,1,1);//创建一个几何体
      let materialLeft = new THREE.MeshBasicMaterial({color:'#0000FF'});//创建材质
      let borderLeft = new THREE.Mesh(geometryLeft, materialLeft);//创建网格模型
      borderLeft.position.set(x,y+(width/2),z);
      this.scene.add(borderLeft);//添加到场景中

      let geometryRight = new THREE.BoxGeometry(conveyorLength,1,1);//创建一个几何体
      let materialRight = new THREE.MeshBasicMaterial({color:'#0000FF'});//创建材质
      let borderRight = new THREE.Mesh(geometryRight, materialRight);//创建网格模型
      borderRight.position.set(x ,y- (width/2),z)
      this.scene.add(borderRight);//添加到场景中

      let lineX = x - conveyorLength/2 +1;
      for (let i = 0; i < conveyorLength/3; i++) {
        const cylinderGeometry = new THREE.CylinderGeometry(0.5, 0.5, width, 32); // 创建圆柱体几何体 参数依次为:半径, 顶部半径, 高, 侧面分段数
        const cylinderMaterial = new THREE.MeshBasicMaterial({ color: '#AAAAAA' }); //  // 创建圆柱体材质绿色
        const cylinderMesh = new THREE.Mesh(cylinderGeometry, cylinderMaterial);// 使用几何体和材质创建圆柱体网格
        cylinderMesh.position.set(lineX+(i*3),y,z);
        this.scene.add(cylinderMesh);// 将圆柱体添加到场景中
      }
    },

this.initConveyor(this.begin.x+(this.conveyor.lang/2),this.begin.y,this.begin.z,6,this.conveyor.lang);//前三个参数是xyz,后面两个一个是传送带宽度,一个是传送带长度

然后就得到一个像长梯子一样的传送带

然后需要在这个传送带中间添加多个设备,以生产PCB为例,生产工艺分别为,刷锡膏,SMT,PA,QC等,这里放SMT,PA和QC三个工序段。并并标上名称,还可以加上pass多少个,ng多少个,用于后续章节中在设备上显示。

machineList:[
    {name:'SMT1',pass:1000,ng:4,workTime:1002},
    {name:'SMT2',pass:996,ng:6,workTime:1002},
    {name:'PA1',pass:990,ng:5,workTime:1002},
    {name:'PA2',pass:885,ng:5,workTime:1002},
    {name:'QC1',pass:880,ng:12,workTime:1002},
    {name:'QC2',pass:880,ng:12,workTime:1002},
], 
initMachine(){ // 初始哈设备
      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.scene.add(box);//添加到场景中
      }
    },

添加设备后的场景如下

目前还是很丑的,不过不担心,后续会慢慢完善。目前是长方体,为了看出来每个长方体代表什么设备,我们给这些长方体添加上名字,这里用sprite组件实现,好处是无论怎么旋转场景,你始终能看到这个设备的名字,

initMachineName(x,y,z,machine){//创建设备信息
      const canvas = document.createElement('canvas');
      const context = canvas.getContext('2d');
      context.font = 'bold 30px Arial';
      context.fillStyle = '#1296db';
      context.fillText(machine.name, 10, 50);
      const texture = new THREE.Texture(canvas);
      texture.needsUpdate = true; // 确保纹理更新
      const spriteMaterial = new THREE.SpriteMaterial({map: texture});
      const sprite = new THREE.Sprite(spriteMaterial);
      sprite.position.set(x, y, z)
      sprite.scale.set(10, 10, 10); //只需要设置x、y两个分量就可以
      sprite.name = machine.name
      this.scene.add( sprite );
    },

效果如下

然后就要给这个产线添加产品了,我们在传送带上放上多个正方体,为了提高辨识度,用红色的正方体代替,代码如下:

 initBox(x,y,z){
      for (let i = 0; i < 22; i++) {
        let geometry = new THREE.BoxGeometry(3,3,3);//创建一个几何体
        let material = new THREE.MeshBasicMaterial({color:'#FF0000'});//创建材质
        let box = new THREE.Mesh(geometry, material);//创建网格模型
        box.position.set(x+i*10,y,z+2);
        this.boxList.push(box)
      }
      for (let i = 0; i < 22; i++) {
        this.scene.add(this.boxList[i]);//添加到场景中
      }
    },

这里已经有了产线最基本的样子,但是还是静态的,需要让红色小方块 都动起来,所以需要添加动画,这里就用最基本的方式实现动画,且每个小正方体移动到产线结尾要再回到产线开头。所以我们在渲染动画里不断修改红色长方体位置。

 initAnimate() {//创建动画
      requestAnimationFrame(this.initAnimate);
      this.renderer.render(this.scene, this.camera);
      if(this.boxList.length>0){
        this.boxList.forEach(item=> {
          if (item.position.x > 220) {
            item.position.x = 0
          } else {
            item.position.x += 0.1
          }
        });
      }
    },

最终效果如下

产线Demo一

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

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

相关文章

要养生也要时尚,益百分满足你的所有需求

要养生也要时尚&#xff0c;益百分满足你的所有需求 艾灸是个好东西&#xff0c;尤其是在近几年的时候&#xff0c;艾灸就像一阵浪潮席卷进了人们的日常生活之中&#xff0c;我们可以在街边看到大大小小的艾灸馆&#xff0c;有些评价比较高的艾灸馆门前甚至还排起了长长的队伍…

Langchain入门到实战-第四弹

Langchain入门到实战 Langchain中的提示词官网地址Langchain概述Langchain的提示词用法更新计划 Langchain中的提示词 语言模型提示模板是预定义的生成语言模型提示的方法。模板可能包括指令、少样本示例、特定任务的上下文和问题。LangChain 提供了创建和处理提示模板的工具。…

TS-namespace(命名空间)#记录

一、命名空间 1、ts 中的 “命名空间” 就是之前的 “内部模块”&#xff0c;任何使用 module 关键字来声明一个内部模块的地方都应该使用 namespace 关键字来替换。 // ts 中的“内部模块” &#xff08;废弃&#xff09; module X { }// ts 中的“命名空间” &#xff08…

系统启动修复和SYSTEM丢失损坏故障处理

系统启动修复和SYSTEM丢失损坏故障处理 一、问题描述 你的电脑/设备需要修复。无法加载应用程序或操作系统&#xff0c;原因是所需文件丢失或包含错误。 文件:\Windows\system32\winload.exe 错误代码: 0xc000000e 二、问题分析 1.查询winload.exe是win7或者win10以上系统…

NX二次开发UF_LAYER(图层相关操作)常用函数

目录 一、概述 二、函数的介绍 2.1 UF_LAYER_ask_category_info &#xff08;查询图层类别信息&#xff09; 2.2 UF_LAYER_ask_category_tag&#xff08;查询图层类别TAG&#xff09; 2.3 UF_LAYER_ask_status&#xff08;查询图层的状态&#xff09; 2.4 UF_LAYER_ask_wo…

护眼灯到底有用吗?实用护眼灯十大品牌推荐

护眼灯有用吗&#xff1f;答案无疑是肯定的。选购到一款合适的护眼台灯&#xff0c;益处多多。这些台灯经过精心设计&#xff0c;运用变频电子镇流器技术&#xff0c;显著提高了光线的频率&#xff0c;使之远超人眼的反应速度&#xff0c;从而有效缓解视觉疲劳。此外&#xff0…

适用于手机蓝牙的热敏晶体FA1612AS

EPSON推出的一款1612小尺寸无源热敏晶体:FA1612AS。FA1612AS的额定频率为38.4Mhz的晶体单元&#xff0c;采用无铅材料&#xff0c;符合ROHS标准&#xff0c;内置热敏电阻&#xff0c;可用于移动电话&#xff0c;蓝牙等。热敏晶体FA1612AS的产品特性:额定频率:38.4MHZ外部尺寸规…

Git 仓库内容操作

Git 仓库内容操作 | CoderMast编程桅杆Git 仓库内容操作 添加文件到暂存区 使用如下指令将工作区的文件添加到暂存区&#xff0c;告诉 Git 在下次 commit 时哪些文件做出了修改。 commit 指令详看后续 添加一个或多个文件到暂存区&#xff1a; 添加指定目录到暂存区 添加当前目…

山海鲸电力看板:运维数据一目了然

在信息化高速发展的今天&#xff0c;电力行业的运维管理也迎来了前所未有的变革。山海鲸可视化智慧电力运维可视化看板&#xff0c;以其独特的数据整合能力和直观的可视化效果&#xff0c;成为了电力行业运维管理的得力助手&#xff0c;为电力的稳定运行提供了强大的技术支撑。…

namesilo注册与域名购买教程

namesilo 是目前价格较便宜的国外域名平台&#xff0c;Paypal、Visa 等多种付款方式&#xff0c;还可以免费使用域名隐私保护&#xff0c;性价比非常之高。 1. 访问namesilo.com并注册用户账号。 邮箱可以填 QQ 邮箱&#xff0c;国家选择 China&#xff0c;注册信息尽量真实。…

开发同城O2O跑腿系统源码:构建高效便捷的本地服务平台教程

为了满足用户对便捷的需求&#xff0c;今天我们将一同探讨如何开发一个高效便捷的同城O2O跑腿系统&#xff0c;以构建一个功能全面、操作简单的本地服务平台。 一、确定需求和功能 在开发同城O2O跑腿系统之前&#xff0c;首先需要明确系统的需求和功能。用户可以通过该系统发布…

Mamba模型原理与代码精讲

课程链接&#xff1a;Mamba模型原理与代码精讲_在线视频教程-CSDN程序员研修院 Mamba模型是最近提出的可匹敌甚至超越Transformer的前沿序列模型。 Mamba引入了选择性状态空间模型(SSM), 允许SSM参数成为输入的函数&#xff0c;使得模型能够根据输入token沿着序列长度维度选择…

Ubuntu下使用VisualStudioCode进行Java开发

0-1开始Java语言编程之路 一、Ubuntu下Java语言环境搭建 二、Ubuntu下Docker环境安装 三、使用Docker搭建本地Nexus Maven私有仓库 四、Ubuntu下使用VisualStudioCode进行Java开发 Visual Studio Code 下载 点击这个链接Visual Studio Code&#xff0c;进入VisualStudioCode的…

未来已来:解锁AGI的无限潜能与挑战

未来已来&#xff1a;解锁AGI的无限潜能与挑战 引言 假设你有一天醒来&#xff0c;发现你的智能手机不仅提醒你今天的日程&#xff0c;还把你昨晚做的那个奇怪的梦解释了一番&#xff0c;并建议你可能需要减少咖啡摄入量——这不是科幻电影的情节&#xff0c;而是人工通用智能…

ubuntu apt update:The repository ‘xxx‘ is not signed.报错解决办法(未解决)

文章目录 报错原因及解决办法 报错 rootjax:~# apt update Get:1 file:/var/cuda-repo-l4t-11-4-local InRelease [1575 B] Get:2 file:/var/cudnn-local-repo-ubuntu2004-8.4.1.50 InRelease [1575 B] Get:1 file:/var/cuda-repo-l4t-11-4-local InRelease [1575 B] Get:2 …

C/C++ 入门(7)string类(STL)

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;C 请多多指教&#xff01; 目录 一、标准库中的string 1、了解 2、string类常用接口说明 1、常见的构造函数 2、容量操作 ​编辑 3、访问及遍历操作 4、修改操作 5、非成员函数 二、string类实现 …

电脑回收站恢复,3个靠谱方法(2024版)

“想问问大家&#xff0c;回收站里丢失的文件还能恢复吗&#xff1f;我一不小心就把电脑回收站里的重要数据丢失了&#xff0c;现在不知道怎么操作才能恢复它了。希望大家帮帮我。” 在日常使用电脑的过程中&#xff0c;回收站是我们经常打交道的一个功能&#xff0c;它能帮助我…

【Python创建专属二维码】

1、在PyCharm | Settings | Python Interpreter中添加PDL、PILLOW(注意解释器版本) 2、代码 from PIL import Image import qrcodedef main():# QRCode&#xff08;&#xff09;创建一个对象&#xff1a;qr qrcode.QRCode(version5, error_correctionqrcode.constants.ERROR_…

前端框架技术革新历程:从原生DOM操作、数据双向绑定到虚拟DOM等框架原理深度解析,Web开发与用户体验的共赢

前端的发展与前端框架的发展相辅相成&#xff0c;形成了相互驱动、共同演进的关系。前端技术的进步不仅催生了前端框架的产生&#xff0c;也为其发展提供了源源不断的动力。 前端的发展 前端&#xff0c;即Web前端&#xff0c;是指在创建Web应用程序或网站过程中负责用户界面…

Docker之注册中心的使用与操作

一、Docker注册中心与仓库 Reastry 可译为注册中心或注册服务器&#xff0c;是存放仓库的地方&#xff0c;一个注册中心往往有很多仓库。Docker默认的注册中心是Docker Hub&#xff0c;其可以通过浏览器访问&#xff0c;也可以使用docker search命令访问。 仓库是集中存放镜像…