ThreeJs模拟工厂生产过程六

        车间模型有了,但是还是显得空旷,这节给车间添加线边仓,线边仓的作用是为了节省时间,保持产线持续生产的,比如生成手机的时候,会更多的原料放在线边仓,如果产线上的物料用完了,可以从线边仓得到补给,而不用去仓库领料,这样可以保持产线的不间断,所以一般的仓库都有线边仓的存在,有的也叫暂存仓等。

        之前的章节中有绘制过仓库,我们可以参考那个章节的功能,先分析功能,假设我们需要绘制一个两排,五层,三列的货架,。那么首先应该需要循环三次,第一层循环是循环两次,产生两排货架,并保证每次循环,x或者y轴存在偏移来保持货架不重叠,偏移的距离要大于货架的长度或者宽度,第二层循环用来循环是循环五次,产生货架的层数,货架的层数要考虑到层板厚度的影响,层数的偏移要大于今后放置物品的高度,第三层循环是循环每层的列数,循环列数要注意的是考虑到立柱的宽度,也就是货架腿的宽度,最终产生完整的货架。

首先我们需要整合下数据,下面是代码:

 initShelf(){
      for (let i = 0; i < this.rackRowCount; i++) { //循环两次产生两排
        this.indistanceY = this.indistanceY + 55;//并排货架的偏移量,正式开发中可以根据货架的层板动态算出来
        for (let j = 0; j < this.rackColCount; j++) { //循环三次产生三列
          let shelfName = '货架' + (j + 1) + "上"
          this.shelfList.push({
            shelfName: (i + 1) + "排_" + shelfName,
            planeWidth: this.plane.planeWidth,
            planeHeight: this.plane.planeHeight,
            planeLength: this.plane.planeLength,
            holderLength: this.holder.holderLength,
            holderHeight: this.holder.holderHeight,
            holderWidth: this.holder.holderWidth,
            positionX: this.indistanceX,
            positionY: this.indistanceY + (j * this.plane.planeLength),//每个货架层平移产生多列货架
            positionZ: this.holder.holderHeight ,//距离地面的高度
            layerNum: this.layerNum,
            columnNum: this.columnNum
          });
        }
      }
      for(let i = 0;i < this.shelfList.length; i++){//再次循环货架列,调用生成货架的方法,传参要包含xyz,以及长宽高等
        for(let j = 0; j < this.shelfList[i].layerNum; j++){//循环每列货架的的层数
          this.addShelf(
              this.shelfList[i].positionX,
              this.shelfList[i].positionY,
              this.shelfList[i].positionZ*(j+1)-10,//因为整个场景的地板并非0,所以要往下偏移让货架腿放在地板上,+1是为了层板厚度
              this.shelfList[i].planeWidth,
              this.shelfList[i].planeLength,
              this.shelfList[i].planeHeight,
              this.shelfList[i].holderLength,
              this.shelfList[i].holderWidth,
              this.shelfList[i].holderHeight,
              this.shelfList[i].shelfName+"_"+(j+1)+"层",
              this.shelfList[i].columnNum);
        }
      }
    },

这部分是把货架数据放到shelfList,再通过循环layerNum调用绘制货架的方法,实现冬天绘制货架,

绘制货架,先要考虑需要绘制的模型,模型会包括三条腿和每层的层板,每层的层板是独立的,四条腿是形状大小一样的,我们只需要绘制一个几何体,然后引用几何体绘制网格模型并设置其对应的位置就好了。绘制货架要注意考虑货架的层板,立柱的相互影响,要设置正确的偏移量以保证绘制的正确性,可以先根据逻辑绘制出来,再根据展示的效果调整偏移量,偏移量尽量用动态数据,放置后面修改了货架的长宽高后需要再次调整偏移量数据。代码如下:

//新增货架
    addShelf(x,y,z,plane_x,plane_y,plane_z,holder_x,holder_y,holder_z,name,num){
      let RackMat2 = new THREE.MeshPhongMaterial({
        color: 0xffffff, // 设置颜色
        shininess: 20 // 设置高光大小,范围为0到128,默认值为30
      });
      let plane = new THREE.BoxGeometry( plane_x, plane_y/num+1,plane_z);//层板考虑柱子腿宽度
      for(let i = 0; i < num; i++){//循环每层的个数
        let gz =  y + plane_y/num/2 + (plane_y/num)*i + 0.5;//柱子腿宽度为1,要偏移0.5
        let obj = new THREE.Mesh( plane, RackMat2 );
        obj.position.set(x, gz, z) ;
        obj.name = name
        this.scene.add(obj);
      }
      let holder = new THREE.BoxGeometry( holder_x, holder_y, holder_z );
      let obj2 = new THREE.Mesh( holder, RackMat2, 0 );
      let obj3 = new THREE.Mesh( holder, RackMat2, 0 );
      let obj4 = new THREE.Mesh( holder, RackMat2, 0 );
      let obj5 = new THREE.Mesh( holder, RackMat2, 0 );
      obj2.position.set(x-plane_x/2+holder_x/2,y+holder_y/2,z-holder_z/2-plane_z/2,);
      obj3.position.set(x+plane_x/2-holder_x/2,y+holder_y/2, z-holder_z/2-plane_z/2, );
      obj4.position.set(x-plane_x/2+holder_x/2,y+plane_y-holder_y/2+1,z-holder_z/2-plane_z/2 );
      obj5.position.set(x+plane_x/2-holder_x/2,y+plane_y-holder_y/2+1, z-holder_z/2-plane_z/2 );
      this.scene.add(obj2);this.scene.add(obj3);this.scene.add(obj4);this.scene.add(obj5);
    },

绘制结果如下:

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baker_zhuang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值