import * as BufferGeometryUtils from '../utils/BufferGeometryUtils.js';
|
|
function StoreShelf(option) {
|
this.binLength = option.binLength||50;//库位长度
|
this.binWidth = option.binWidth||50;//库位宽
|
this.binHeight = option.binHeight||50;//库位高
|
this.binXNum = option.binXNum||1;//库位X轴方向库位数量
|
this.binZNum = option.binZNum||10;//库位Z轴方向库位数量
|
this.binYNum = option.binYNum||10;//库位Y轴库位数量
|
this.bottomHight = option.bottomHeight||20;//底层高度,底层
|
this.positionX = option.position.x||0;//库位位置
|
this.positionY = option.position.y||0;//库位位置
|
this.positionZ = option.position.z||0;//库位位置
|
this.rackLengh = 3;//支架的长度,默认设动为3
|
this.rackWidth = 3;//支架的宽度,默认设定为3
|
this.mesh = null;
|
|
// 材质
|
let shelfMat = new THREE.MeshPhysicalMaterial({
|
color: 0x175EC0,
|
transparent: false,
|
opacity: 0.7
|
});
|
|
// 货架总高
|
let shelfHeight=this.bottomHight+(this.binYNum)*this.binHeight;
|
// 支架模型 + 材质
|
let rackBoxGeometry=new THREE.BoxGeometry(this.rackLengh,shelfHeight,this.rackWidth);
|
// 托板模型 + 材质
|
let planeBoxGeometry = new THREE.BoxGeometry(this.binLength, 2, this.binWidth+this.rackWidth); // 覆盖多一根支架宽度
|
let planeRackBoxGeometry = new THREE.BoxGeometry(3, 2, this.binWidth+this.rackWidth);
|
|
// Y轴定位
|
let positionY = this.positionY + shelfHeight / 2;
|
|
//左侧支架柱的X轴定位
|
let leftPositionX=this.positionX-this.binLength/2;
|
//右侧支架柱的X轴定位
|
let rightPositionX=this.positionX+this.binLength/2 - this.rackLengh; // 缩进支架长度
|
|
let geometries = [];
|
let transform = new THREE.Object3D();
|
// 初始化支架模型
|
for(let i=0;i<=this.binZNum;i++) {
|
let positionZ = - ( this.positionZ + i*this.binWidth );
|
// -----
|
let leftClone = rackBoxGeometry.clone();
|
transform.position.set(leftPositionX,positionY,positionZ);
|
transform.updateMatrix();
|
leftClone.applyMatrix4(transform.matrix);
|
geometries.push(leftClone);
|
|
let rightClone = rackBoxGeometry.clone();
|
transform.position.set(rightPositionX,positionY,positionZ);
|
transform.updateMatrix();
|
rightClone.applyMatrix4(transform.matrix);
|
geometries.push(rightClone);
|
}
|
// 初始化托板模型
|
for(let i = 0;i < this.binZNum;i++) {
|
for (let j = 0;j <= this.binYNum;j++) {
|
if (j !== this.binYNum) {
|
let leftClone = planeRackBoxGeometry.clone();
|
let positionY = this.positionY + this.bottomHight + j*this.binHeight + 1;
|
let positionZ = - ( this.positionZ + i * this.binWidth + this.binWidth/2 );
|
transform.position.set(this.positionX - 16, positionY, positionZ);
|
transform.updateMatrix();
|
leftClone.applyMatrix4(transform.matrix);
|
geometries.push(leftClone);
|
|
let rightClone = planeRackBoxGeometry.clone();
|
positionY = this.positionY + this.bottomHight + j*this.binHeight + 1;
|
positionZ = - ( this.positionZ + i * this.binWidth + this.binWidth/2 );
|
transform.position.set(this.positionX + 13, positionY, positionZ);
|
transform.updateMatrix();
|
rightClone.applyMatrix4(transform.matrix);
|
geometries.push(rightClone);
|
} else {
|
let clone = planeBoxGeometry.clone();
|
let positionY= this.positionY + this.bottomHight + j*this.binHeight + 1;
|
let positionZ= - ( this.positionZ + i * this.binWidth + this.binWidth/2 );
|
transform.position.set(this.positionX-this.rackLengh/2,positionY,positionZ);
|
transform.updateMatrix();
|
clone.applyMatrix4(transform.matrix);
|
geometries.push(clone);
|
}
|
}
|
}
|
|
let mergedGeometry = BufferGeometryUtils.mergeBufferGeometries(geometries);
|
let mesh = new THREE.Mesh(mergedGeometry, shelfMat);
|
mesh.castShadow = true;
|
this.mesh = mesh;
|
return this;
|
}
|
|
export {StoreShelf}
|