|
|
|
@ -1,16 +1,14 @@ |
|
|
|
import * as THREE from 'three' |
|
|
|
import { BufferGeometry } from 'three' |
|
|
|
import BaseRenderer from '@/core/base/BaseRenderer.ts' |
|
|
|
import { Line2 } from 'three/examples/jsm/lines/Line2.js' |
|
|
|
import { LineGeometry } from 'three/examples/jsm/lines/LineGeometry.js' |
|
|
|
import { LineMaterial } from 'three/examples/jsm/lines/LineMaterial.js' |
|
|
|
import * as BufferGeometryUtils from "three/addons/utils/BufferGeometryUtils.js"; |
|
|
|
import { decimalSumBy } from '@/core/ModelUtils' |
|
|
|
import Constract from '@/core/Constract.ts' |
|
|
|
import Plastic_Rough_JPG from '@/assets/Models/Plastic_Rough.jpg' |
|
|
|
import {BufferGeometry} from "three"; |
|
|
|
import storageBar_PNG from "@/assets/Models/storageBar.png"; |
|
|
|
import {Material} from "three/src/materials/Material"; |
|
|
|
import {InstancedMesh} from "three/src/objects/InstancedMesh"; |
|
|
|
import storageBar_PNG from '@/assets/Models/storageBar.png' |
|
|
|
import { Material } from 'three/src/materials/Material' |
|
|
|
import { InstancedMesh } from 'three/src/objects/InstancedMesh' |
|
|
|
//@ts-ignore
|
|
|
|
import { mergeGeometries } from 'three/addons/utils/BufferGeometryUtils.js' |
|
|
|
|
|
|
|
/** |
|
|
|
* 货架货位渲染器 |
|
|
|
@ -127,7 +125,7 @@ export default class RackRenderer extends BaseRenderer { |
|
|
|
// group.add(lineT as THREE.Object3D)
|
|
|
|
// }
|
|
|
|
|
|
|
|
const meshes = this.createRack(item, option); |
|
|
|
const meshes = this.createRack(item, option) |
|
|
|
|
|
|
|
meshes.forEach(mesh => { |
|
|
|
group.add(mesh) |
|
|
|
@ -170,52 +168,52 @@ export default class RackRenderer extends BaseRenderer { |
|
|
|
bottomLinkHeight = 0.2 |
|
|
|
|
|
|
|
barSectionPoints = [ |
|
|
|
{x: -0.05, y: -0.05}, |
|
|
|
{x: -0.025, y: -0.05}, |
|
|
|
{x: -0.01, y: -0.045}, |
|
|
|
{x: 0.05, y: -0.045}, |
|
|
|
{x: 0.025, y: -0.05}, |
|
|
|
{x: 0.05, y: -0.05}, |
|
|
|
{x: 0.05, y: 0.042}, |
|
|
|
{x: 0.042, y: 0.05}, |
|
|
|
{x: 0.025, y: 0.05}, |
|
|
|
{x: 0.025, y: 0.042}, |
|
|
|
{x: 0.042, y: 0.042}, |
|
|
|
{x: 0.042, y: -0.042}, |
|
|
|
{x: -0.042, y: -0.042}, |
|
|
|
{x: -0.042, y: 0.042}, |
|
|
|
{x: -0.025, y: 0.042}, |
|
|
|
{x: -0.025, y: 0.05}, |
|
|
|
{x: -0.042, y: 0.05}, |
|
|
|
{x: -0.05, y: 0.042}, |
|
|
|
{x: -0.05, y: -0.05} |
|
|
|
{ x: -0.05, y: -0.05 }, |
|
|
|
{ x: -0.025, y: -0.05 }, |
|
|
|
{ x: -0.01, y: -0.045 }, |
|
|
|
{ x: 0.05, y: -0.045 }, |
|
|
|
{ x: 0.025, y: -0.05 }, |
|
|
|
{ x: 0.05, y: -0.05 }, |
|
|
|
{ x: 0.05, y: 0.042 }, |
|
|
|
{ x: 0.042, y: 0.05 }, |
|
|
|
{ x: 0.025, y: 0.05 }, |
|
|
|
{ x: 0.025, y: 0.042 }, |
|
|
|
{ x: 0.042, y: 0.042 }, |
|
|
|
{ x: 0.042, y: -0.042 }, |
|
|
|
{ x: -0.042, y: -0.042 }, |
|
|
|
{ x: -0.042, y: 0.042 }, |
|
|
|
{ x: -0.025, y: 0.042 }, |
|
|
|
{ x: -0.025, y: 0.05 }, |
|
|
|
{ x: -0.042, y: 0.05 }, |
|
|
|
{ x: -0.05, y: 0.042 }, |
|
|
|
{ x: -0.05, y: -0.05 } |
|
|
|
] |
|
|
|
|
|
|
|
linkSectionPoints = [ |
|
|
|
{x: -0.05, y: -0.05}, |
|
|
|
{x: -0.05, y: 0.05}, |
|
|
|
{x: 0, y: 0.05}, |
|
|
|
{x: 0, y: 0.06}, |
|
|
|
{x: -0.06, y: 0.06}, |
|
|
|
{x: -0.06, y: -0.05}, |
|
|
|
{x: -0.05, y: -0.05} |
|
|
|
{ x: -0.05, y: -0.05 }, |
|
|
|
{ x: -0.05, y: 0.05 }, |
|
|
|
{ x: 0, y: 0.05 }, |
|
|
|
{ x: 0, y: 0.06 }, |
|
|
|
{ x: -0.06, y: 0.06 }, |
|
|
|
{ x: -0.06, y: -0.05 }, |
|
|
|
{ x: -0.05, y: -0.05 } |
|
|
|
] |
|
|
|
|
|
|
|
linkBarSectionPoints = [ |
|
|
|
{x: -0.025, y: -0.025}, |
|
|
|
{x: 0.025, y: -0.025}, |
|
|
|
{x: 0.025, y: 0.025}, |
|
|
|
{x: -0.025, y: 0.025}, |
|
|
|
{x: -0.025, y: -0.025} |
|
|
|
{ x: -0.025, y: -0.025 }, |
|
|
|
{ x: 0.025, y: -0.025 }, |
|
|
|
{ x: 0.025, y: 0.025 }, |
|
|
|
{ x: -0.025, y: 0.025 }, |
|
|
|
{ x: -0.025, y: -0.025 } |
|
|
|
] |
|
|
|
|
|
|
|
createVerticalBar(x, y, z, length): THREE.BufferGeometry { |
|
|
|
|
|
|
|
// 创建一个形状 柱子的截面形状
|
|
|
|
const shape = new THREE.Shape(); |
|
|
|
shape.moveTo(this.barSectionPoints[0].x, this.barSectionPoints[0].y); |
|
|
|
const shape = new THREE.Shape() |
|
|
|
shape.moveTo(this.barSectionPoints[0].x, this.barSectionPoints[0].y) |
|
|
|
for (let i = 1; i < this.barSectionPoints.length; i++) { |
|
|
|
shape.lineTo(this.barSectionPoints[i].x , this.barSectionPoints[i].y); |
|
|
|
shape.lineTo(this.barSectionPoints[i].x, this.barSectionPoints[i].y) |
|
|
|
} |
|
|
|
|
|
|
|
// 拉伸轨迹线
|
|
|
|
@ -224,18 +222,18 @@ export default class RackRenderer extends BaseRenderer { |
|
|
|
false, // 闭合曲线
|
|
|
|
'catmullrom', |
|
|
|
0 |
|
|
|
); |
|
|
|
) |
|
|
|
|
|
|
|
// 挤出几何图形 参数
|
|
|
|
const options = { |
|
|
|
steps: 1, |
|
|
|
bevelEnabled: false, |
|
|
|
extrudePath: curve, // 设置挤出轨迹
|
|
|
|
}; |
|
|
|
extrudePath: curve // 设置挤出轨迹
|
|
|
|
} |
|
|
|
// 创建挤出几何体
|
|
|
|
const geometry = new THREE.ExtrudeGeometry(shape, options); |
|
|
|
const geometry = new THREE.ExtrudeGeometry(shape, options) |
|
|
|
// 调整uv方便正确贴图
|
|
|
|
this.resetUVs(geometry); |
|
|
|
this.resetUVs(geometry) |
|
|
|
return geometry |
|
|
|
} |
|
|
|
|
|
|
|
@ -244,29 +242,29 @@ export default class RackRenderer extends BaseRenderer { |
|
|
|
let textureLoader = new THREE.TextureLoader() |
|
|
|
|
|
|
|
// 加载纹理
|
|
|
|
const textureHole = textureLoader.load(storageBar_PNG); // 孔洞
|
|
|
|
const textureMaterial = textureLoader.load(Plastic_Rough_JPG); // 表面材质
|
|
|
|
const textureHole = textureLoader.load(storageBar_PNG) // 孔洞
|
|
|
|
const textureMaterial = textureLoader.load(Plastic_Rough_JPG) // 表面材质
|
|
|
|
|
|
|
|
textureHole.repeat.set(10, 18); // X轴重复,Y轴重复
|
|
|
|
textureMaterial.repeat.set(2, 2); // X轴重复,Y轴重复
|
|
|
|
textureHole.repeat.set(10, 18) // X轴重复,Y轴重复
|
|
|
|
textureMaterial.repeat.set(2, 2) // X轴重复,Y轴重复
|
|
|
|
// textureHole.offset.set(0.5, 0)
|
|
|
|
// textureHole.center.set(0.5, 0)
|
|
|
|
|
|
|
|
// 必须设置包裹模式为重复
|
|
|
|
textureHole.wrapS = THREE.RepeatWrapping; |
|
|
|
textureHole.wrapT = THREE.RepeatWrapping; |
|
|
|
textureMaterial.wrapS = THREE.RepeatWrapping; |
|
|
|
textureMaterial.wrapT = THREE.RepeatWrapping; |
|
|
|
|
|
|
|
const material = new THREE.MeshPhongMaterial(); |
|
|
|
material.alphaMap = textureHole; |
|
|
|
material.normalMap = textureMaterial; |
|
|
|
material.color.setHex(this.rackVerticalBarColor, "srgb"); |
|
|
|
material.specular.setHex(0xff6d6d6d, 'srgb'); |
|
|
|
material.transparent = true; |
|
|
|
material.needsUpdate = true; |
|
|
|
|
|
|
|
return material; |
|
|
|
textureHole.wrapS = THREE.RepeatWrapping |
|
|
|
textureHole.wrapT = THREE.RepeatWrapping |
|
|
|
textureMaterial.wrapS = THREE.RepeatWrapping |
|
|
|
textureMaterial.wrapT = THREE.RepeatWrapping |
|
|
|
|
|
|
|
const material = new THREE.MeshPhongMaterial() |
|
|
|
material.alphaMap = textureHole |
|
|
|
material.normalMap = textureMaterial |
|
|
|
material.color.setHex(this.rackVerticalBarColor, 'srgb') |
|
|
|
material.specular.setHex(0xff6d6d6d, 'srgb') |
|
|
|
material.transparent = true |
|
|
|
material.needsUpdate = true |
|
|
|
|
|
|
|
return material |
|
|
|
} |
|
|
|
|
|
|
|
createLinkBar(x, y, z, vBarLength, depth, bottomDistance, topDistance): THREE.BufferGeometry { |
|
|
|
@ -274,10 +272,10 @@ export default class RackRenderer extends BaseRenderer { |
|
|
|
const bgs: BufferGeometry[] = [] |
|
|
|
const top = vBarLength - topDistance |
|
|
|
// 创建一个形状 柱子的截面形状
|
|
|
|
const shape = new THREE.Shape(); |
|
|
|
shape.moveTo(this.linkBarSectionPoints[0].x, this.linkBarSectionPoints[0].y); |
|
|
|
const shape = new THREE.Shape() |
|
|
|
shape.moveTo(this.linkBarSectionPoints[0].x, this.linkBarSectionPoints[0].y) |
|
|
|
for (let i = 1; i < this.linkBarSectionPoints.length; i++) { |
|
|
|
shape.lineTo(this.linkBarSectionPoints[i].x, this.linkBarSectionPoints[i].y); |
|
|
|
shape.lineTo(this.linkBarSectionPoints[i].x, this.linkBarSectionPoints[i].y) |
|
|
|
} |
|
|
|
|
|
|
|
// 拉伸轨迹线 横向 底部
|
|
|
|
@ -286,14 +284,14 @@ export default class RackRenderer extends BaseRenderer { |
|
|
|
false, // 闭合曲线
|
|
|
|
'catmullrom', |
|
|
|
0 |
|
|
|
); |
|
|
|
) |
|
|
|
|
|
|
|
// 挤出几何图形 参数
|
|
|
|
const optionsHBottom = { |
|
|
|
steps: 1, |
|
|
|
bevelEnabled: false, |
|
|
|
extrudePath: curveHBottom, // 设置挤出轨迹
|
|
|
|
}; |
|
|
|
extrudePath: curveHBottom // 设置挤出轨迹
|
|
|
|
} |
|
|
|
|
|
|
|
// 拉伸轨迹线 横向 底部
|
|
|
|
const curveHTop = new THREE.CatmullRomCurve3( |
|
|
|
@ -301,99 +299,98 @@ export default class RackRenderer extends BaseRenderer { |
|
|
|
false, // 闭合曲线
|
|
|
|
'catmullrom', |
|
|
|
0 |
|
|
|
); |
|
|
|
) |
|
|
|
|
|
|
|
// 挤出几何图形 参数
|
|
|
|
const optionsHTop = { |
|
|
|
steps: 1, |
|
|
|
bevelEnabled: false, |
|
|
|
extrudePath: curveHTop, // 设置挤出轨迹
|
|
|
|
}; |
|
|
|
extrudePath: curveHTop // 设置挤出轨迹
|
|
|
|
} |
|
|
|
|
|
|
|
// 创建挤出几何体
|
|
|
|
const geometryHBottom = new THREE.ExtrudeGeometry(shape, optionsHBottom); |
|
|
|
const geometryHTop = new THREE.ExtrudeGeometry(shape, optionsHTop); |
|
|
|
const geometryHBottom = new THREE.ExtrudeGeometry(shape, optionsHBottom) |
|
|
|
const geometryHTop = new THREE.ExtrudeGeometry(shape, optionsHTop) |
|
|
|
bgs.push(geometryHBottom, geometryHTop) |
|
|
|
|
|
|
|
let remainingHeight = vBarLength - bottomDistance - topDistance |
|
|
|
let remainingHeight = vBarLength - bottomDistance - topDistance |
|
|
|
|
|
|
|
// 需要创建斜杆
|
|
|
|
|
|
|
|
for (let i = 0; i < Math.floor(remainingHeight / depth); i++) { |
|
|
|
// 拉伸轨迹线 斜向
|
|
|
|
const curveD = new THREE.CatmullRomCurve3( |
|
|
|
(i%2 == 0) ? [new THREE.Vector3(0, bottomDistance + depth * i, 0), new THREE.Vector3(0, bottomDistance + depth * (i+1), depth)] |
|
|
|
: [new THREE.Vector3(0, bottomDistance + depth * (i+1), 0), new THREE.Vector3(0, bottomDistance + depth * (i), depth)], |
|
|
|
(i % 2 == 0) ? [new THREE.Vector3(0, bottomDistance + depth * i, 0), new THREE.Vector3(0, bottomDistance + depth * (i + 1), depth)] |
|
|
|
: [new THREE.Vector3(0, bottomDistance + depth * (i + 1), 0), new THREE.Vector3(0, bottomDistance + depth * (i), depth)], |
|
|
|
false, // 闭合曲线
|
|
|
|
'catmullrom', |
|
|
|
0 |
|
|
|
); |
|
|
|
) |
|
|
|
|
|
|
|
const optionsD = { |
|
|
|
steps: 1, |
|
|
|
bevelEnabled: false, |
|
|
|
extrudePath: curveD, // 设置挤出轨迹
|
|
|
|
}; |
|
|
|
extrudePath: curveD // 设置挤出轨迹
|
|
|
|
} |
|
|
|
|
|
|
|
const geometryD = new THREE.ExtrudeGeometry(shape, optionsD); |
|
|
|
const geometryD = new THREE.ExtrudeGeometry(shape, optionsD) |
|
|
|
bgs.push(geometryD) |
|
|
|
} |
|
|
|
|
|
|
|
if (vBarLength - bottomDistance - topDistance > depth) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// 调整uv方便正确贴图
|
|
|
|
// this.resetUVs(geometry);
|
|
|
|
return BufferGeometryUtils.mergeGeometries(bgs) |
|
|
|
return mergeGeometries(bgs) |
|
|
|
} |
|
|
|
|
|
|
|
createLinkBarMaterial(): THREE.Material { |
|
|
|
|
|
|
|
const material = new THREE.MeshPhongMaterial(); |
|
|
|
material.color.setHex(this.rackLinkBarColor, "srgb"); |
|
|
|
material.specular.setHex(0xff6d6d6d, 'srgb'); |
|
|
|
material.transparent = true; |
|
|
|
material.needsUpdate = true; |
|
|
|
const material = new THREE.MeshPhongMaterial() |
|
|
|
material.color.setHex(this.rackLinkBarColor, 'srgb') |
|
|
|
material.specular.setHex(0xff6d6d6d, 'srgb') |
|
|
|
material.transparent = true |
|
|
|
material.needsUpdate = true |
|
|
|
|
|
|
|
return material; |
|
|
|
return material |
|
|
|
} |
|
|
|
|
|
|
|
createHorizontalBar(x, y, z, length): THREE.BufferGeometry { |
|
|
|
|
|
|
|
// 创建一个形状 柱子的截面形状
|
|
|
|
const shape = new THREE.Shape(); |
|
|
|
shape.moveTo(this.barSectionPoints[0].x, this.barSectionPoints[0].y); |
|
|
|
const shape = new THREE.Shape() |
|
|
|
shape.moveTo(this.barSectionPoints[0].x, this.barSectionPoints[0].y) |
|
|
|
for (let i = 1; i < this.barSectionPoints.length; i++) { |
|
|
|
shape.lineTo(this.barSectionPoints[i].x , this.barSectionPoints[i].y); |
|
|
|
shape.lineTo(this.barSectionPoints[i].x, this.barSectionPoints[i].y) |
|
|
|
} |
|
|
|
|
|
|
|
// 拉伸轨迹线
|
|
|
|
const curve = new THREE.CatmullRomCurve3( |
|
|
|
[new THREE.Vector3(0.05, 0, 0), new THREE.Vector3(length -0.05, 0, 0)], |
|
|
|
[new THREE.Vector3(0.05, 0, 0), new THREE.Vector3(length - 0.05, 0, 0)], |
|
|
|
false, // 闭合曲线
|
|
|
|
'catmullrom', |
|
|
|
0 |
|
|
|
); |
|
|
|
) |
|
|
|
|
|
|
|
// 挤出几何图形 参数
|
|
|
|
const options = { |
|
|
|
steps: 1, |
|
|
|
bevelEnabled: false, |
|
|
|
extrudePath: curve, // 设置挤出轨迹
|
|
|
|
}; |
|
|
|
extrudePath: curve // 设置挤出轨迹
|
|
|
|
} |
|
|
|
// 创建挤出几何体
|
|
|
|
const geometry = new THREE.ExtrudeGeometry(shape, options); |
|
|
|
const geometry = new THREE.ExtrudeGeometry(shape, options) |
|
|
|
|
|
|
|
const linkShapeL = new THREE.Shape(); |
|
|
|
const linkShapeR = new THREE.Shape(); |
|
|
|
linkShapeL.moveTo(this.linkSectionPoints[0].x, this.linkSectionPoints[0].y); |
|
|
|
linkShapeR.moveTo(this.linkSectionPoints[0].x + (length), this.linkSectionPoints[0].y); |
|
|
|
const linkShapeL = new THREE.Shape() |
|
|
|
const linkShapeR = new THREE.Shape() |
|
|
|
linkShapeL.moveTo(this.linkSectionPoints[0].x, this.linkSectionPoints[0].y) |
|
|
|
linkShapeR.moveTo(this.linkSectionPoints[0].x + (length), this.linkSectionPoints[0].y) |
|
|
|
for (let i = 1; i < this.linkSectionPoints.length; i++) { |
|
|
|
linkShapeL.lineTo(this.linkSectionPoints[i].x , this.linkSectionPoints[i].y); |
|
|
|
linkShapeR.lineTo(this.linkSectionPoints[i].x + (length), this.linkSectionPoints[i].y); |
|
|
|
linkShapeL.lineTo(this.linkSectionPoints[i].x, this.linkSectionPoints[i].y) |
|
|
|
linkShapeR.lineTo(this.linkSectionPoints[i].x + (length), this.linkSectionPoints[i].y) |
|
|
|
} |
|
|
|
|
|
|
|
// 拉伸轨迹线
|
|
|
|
@ -402,36 +399,35 @@ export default class RackRenderer extends BaseRenderer { |
|
|
|
false, // 闭合曲线
|
|
|
|
'catmullrom', |
|
|
|
0 |
|
|
|
); |
|
|
|
) |
|
|
|
|
|
|
|
// 挤出几何图形 参数
|
|
|
|
const linkOptions = { |
|
|
|
steps: 1, |
|
|
|
bevelEnabled: false, |
|
|
|
extrudePath: linkCurve, // 设置挤出轨迹
|
|
|
|
}; |
|
|
|
extrudePath: linkCurve // 设置挤出轨迹
|
|
|
|
} |
|
|
|
// 创建挤出几何体
|
|
|
|
const linkGeometryL = new THREE.ExtrudeGeometry(linkShapeL, linkOptions); |
|
|
|
const linkGeometryL = new THREE.ExtrudeGeometry(linkShapeL, linkOptions) |
|
|
|
linkGeometryL.rotateZ(-Math.PI / 2) |
|
|
|
const linkGeometryR = new THREE.ExtrudeGeometry(linkShapeR, linkOptions); |
|
|
|
const linkGeometryR = new THREE.ExtrudeGeometry(linkShapeR, linkOptions) |
|
|
|
linkGeometryR.rotateX(-Math.PI) |
|
|
|
linkGeometryR.rotateZ(-Math.PI / 2) |
|
|
|
|
|
|
|
|
|
|
|
// 调整uv方便正确贴图
|
|
|
|
// this.resetUVs(geometry);
|
|
|
|
return BufferGeometryUtils.mergeGeometries([geometry, linkGeometryL, linkGeometryR]) |
|
|
|
return mergeGeometries([geometry, linkGeometryL, linkGeometryR]) |
|
|
|
} |
|
|
|
|
|
|
|
createHorizontalBarMaterial(): THREE.Material { |
|
|
|
|
|
|
|
const material = new THREE.MeshPhongMaterial(); |
|
|
|
material.color.setHex(this.rackHorizontalBarColor, "srgb"); |
|
|
|
material.specular.setHex(0xff6d6d6d, 'srgb'); |
|
|
|
material.transparent = true; |
|
|
|
material.needsUpdate = true; |
|
|
|
const material = new THREE.MeshPhongMaterial() |
|
|
|
material.color.setHex(this.rackHorizontalBarColor, 'srgb') |
|
|
|
material.specular.setHex(0xff6d6d6d, 'srgb') |
|
|
|
material.transparent = true |
|
|
|
material.needsUpdate = true |
|
|
|
|
|
|
|
return material; |
|
|
|
return material |
|
|
|
} |
|
|
|
|
|
|
|
createRack(item: ItemJson, option?: RendererCudOption): InstancedMesh[] { |
|
|
|
@ -455,12 +451,12 @@ export default class RackRenderer extends BaseRenderer { |
|
|
|
const rackHeight = _.max(heights) |
|
|
|
|
|
|
|
// 计算立住坐标点和长度
|
|
|
|
const vBarMatrix: {x: number, y: number, z: number, sx: number, sy: number, sz: number, rx: number, ry: number, rz: number, l: number}[] = []; |
|
|
|
const vBarMatrix: { x: number, y: number, z: number, sx: number, sy: number, sz: number, rx: number, ry: number, rz: number, l: number }[] = [] |
|
|
|
|
|
|
|
// 计算
|
|
|
|
const linkBarMatrix: {x: number, y: number, z: number, sx: number, sy: number, sz: number, rx: number, ry: number, rz: number, l: number}[] = []; |
|
|
|
const linkBarMatrix: { x: number, y: number, z: number, sx: number, sy: number, sz: number, rx: number, ry: number, rz: number, l: number }[] = [] |
|
|
|
|
|
|
|
let distanceX = 0, distanceY = 0; |
|
|
|
let distanceX = 0, distanceY = 0 |
|
|
|
|
|
|
|
for (let i = -1; i < item.dt.bays.length; i++) { |
|
|
|
if (i >= 0) { |
|
|
|
@ -475,7 +471,7 @@ export default class RackRenderer extends BaseRenderer { |
|
|
|
sy: 1, |
|
|
|
sz: 1, |
|
|
|
rx: 0, |
|
|
|
ry: Math.PI/2, |
|
|
|
ry: Math.PI / 2, |
|
|
|
rz: 0, |
|
|
|
l: rackHeight |
|
|
|
}) |
|
|
|
@ -487,29 +483,29 @@ export default class RackRenderer extends BaseRenderer { |
|
|
|
sy: 1, |
|
|
|
sz: 1, |
|
|
|
rx: 0, |
|
|
|
ry: -Math.PI/2, |
|
|
|
ry: -Math.PI / 2, |
|
|
|
rz: 0, |
|
|
|
l: rackHeight |
|
|
|
}) |
|
|
|
linkBarMatrix.push({ |
|
|
|
x: rackPoint.x + distanceX, |
|
|
|
y: rackPoint.y, |
|
|
|
z: i%2 == 0 ? (rackPoint.z + item.dt.rackDepth) : rackPoint.z, |
|
|
|
z: i % 2 == 0 ? (rackPoint.z + item.dt.rackDepth) : rackPoint.z, |
|
|
|
sx: 1, |
|
|
|
sy: 1, |
|
|
|
sz: 1, |
|
|
|
rx: 0, |
|
|
|
ry: i%2 == 0 ? Math.PI : 0, |
|
|
|
ry: i % 2 == 0 ? Math.PI : 0, |
|
|
|
rz: 0, |
|
|
|
l: rackHeight |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
// 计算横梁数量
|
|
|
|
const hBarMatrix: {x: number, y: number, z: number, sx: number, sy: number, sz: number, rx: number, ry: number, rz: number, l: number}[] = []; |
|
|
|
distanceX = 0; |
|
|
|
const hBarMatrix: { x: number, y: number, z: number, sx: number, sy: number, sz: number, rx: number, ry: number, rz: number, l: number }[] = [] |
|
|
|
distanceX = 0 |
|
|
|
for (let i = 0; i < item.dt.bays.length; i++) { |
|
|
|
distanceY = this.bottomBarHeight; |
|
|
|
distanceY = this.bottomBarHeight |
|
|
|
const bay = item.dt.bays[i] |
|
|
|
for (let j = 0; j < bay.levelHeight.length; j++) { |
|
|
|
const levelHeight = bay.levelHeight[j] |
|
|
|
@ -523,7 +519,7 @@ export default class RackRenderer extends BaseRenderer { |
|
|
|
sx: 1, |
|
|
|
sy: 0.8, |
|
|
|
sz: 1, |
|
|
|
rx: Math.PI/2, |
|
|
|
rx: Math.PI / 2, |
|
|
|
ry: 0, |
|
|
|
rz: 0, |
|
|
|
l: bay.bayWidth |
|
|
|
@ -535,7 +531,7 @@ export default class RackRenderer extends BaseRenderer { |
|
|
|
sx: 1, |
|
|
|
sy: 0.8, |
|
|
|
sz: 1, |
|
|
|
rx: -Math.PI/2, |
|
|
|
rx: -Math.PI / 2, |
|
|
|
ry: 0, |
|
|
|
rz: 0, |
|
|
|
l: bay.bayWidth |
|
|
|
@ -545,7 +541,7 @@ export default class RackRenderer extends BaseRenderer { |
|
|
|
distanceX += bay.bayWidth |
|
|
|
} |
|
|
|
|
|
|
|
const meshes: InstancedMesh[] = []; |
|
|
|
const meshes: InstancedMesh[] = [] |
|
|
|
|
|
|
|
if (vBarMatrix.length > 0) { |
|
|
|
if (!this.rackVerticalBarGeometry) { |
|
|
|
@ -554,15 +550,15 @@ export default class RackRenderer extends BaseRenderer { |
|
|
|
if (!this.rackVerticalBarMaterial) { |
|
|
|
this.rackVerticalBarMaterial = this.createVerticalBarMaterial() |
|
|
|
} |
|
|
|
const dummy = new THREE.Object3D(); |
|
|
|
const vBarMesh = new THREE.InstancedMesh(this.rackVerticalBarGeometry, this.rackVerticalBarMaterial, vBarMatrix.length); |
|
|
|
const dummy = new THREE.Object3D() |
|
|
|
const vBarMesh = new THREE.InstancedMesh(this.rackVerticalBarGeometry, this.rackVerticalBarMaterial, vBarMatrix.length) |
|
|
|
for (let i = 0; i < vBarMatrix.length; i++) { |
|
|
|
const vp = vBarMatrix[i] |
|
|
|
dummy.position.set(vp.x, vp.y, vp.z); |
|
|
|
dummy.rotation.set(vp.rx, vp.ry, vp.rz); |
|
|
|
dummy.scale.set(vp.sx, vp.sy, vp.sz); |
|
|
|
dummy.updateMatrix(); |
|
|
|
vBarMesh.setMatrixAt(i, dummy.matrix); |
|
|
|
dummy.position.set(vp.x, vp.y, vp.z) |
|
|
|
dummy.rotation.set(vp.rx, vp.ry, vp.rz) |
|
|
|
dummy.scale.set(vp.sx, vp.sy, vp.sz) |
|
|
|
dummy.updateMatrix() |
|
|
|
vBarMesh.setMatrixAt(i, dummy.matrix) |
|
|
|
} |
|
|
|
meshes.push(vBarMesh) |
|
|
|
} |
|
|
|
@ -574,15 +570,15 @@ export default class RackRenderer extends BaseRenderer { |
|
|
|
if (!this.rackLinkBarMaterial) { |
|
|
|
this.rackLinkBarMaterial = this.createLinkBarMaterial() |
|
|
|
} |
|
|
|
const dummy = new THREE.Object3D(); |
|
|
|
const linkBarMesh = new THREE.InstancedMesh(this.rackLinkBarGeometry, this.rackLinkBarMaterial, linkBarMatrix.length); |
|
|
|
const dummy = new THREE.Object3D() |
|
|
|
const linkBarMesh = new THREE.InstancedMesh(this.rackLinkBarGeometry, this.rackLinkBarMaterial, linkBarMatrix.length) |
|
|
|
for (let i = 0; i < linkBarMatrix.length; i++) { |
|
|
|
const lp = linkBarMatrix[i] |
|
|
|
dummy.position.set(lp.x, lp.y, lp.z); |
|
|
|
dummy.rotation.set(lp.rx, lp.ry, lp.rz); |
|
|
|
dummy.scale.set(lp.sx, lp.sy, lp.sz); |
|
|
|
dummy.updateMatrix(); |
|
|
|
linkBarMesh.setMatrixAt(i, dummy.matrix); |
|
|
|
dummy.position.set(lp.x, lp.y, lp.z) |
|
|
|
dummy.rotation.set(lp.rx, lp.ry, lp.rz) |
|
|
|
dummy.scale.set(lp.sx, lp.sy, lp.sz) |
|
|
|
dummy.updateMatrix() |
|
|
|
linkBarMesh.setMatrixAt(i, dummy.matrix) |
|
|
|
} |
|
|
|
meshes.push(linkBarMesh) |
|
|
|
} |
|
|
|
@ -594,51 +590,51 @@ export default class RackRenderer extends BaseRenderer { |
|
|
|
if (!this.rackHorizontalBarMaterial) { |
|
|
|
this.rackHorizontalBarMaterial = this.createHorizontalBarMaterial() |
|
|
|
} |
|
|
|
const dummy = new THREE.Object3D(); |
|
|
|
const hBarMesh = new THREE.InstancedMesh(this.rackHorizontalBarGeometry, this.rackHorizontalBarMaterial, hBarMatrix.length); |
|
|
|
const dummy = new THREE.Object3D() |
|
|
|
const hBarMesh = new THREE.InstancedMesh(this.rackHorizontalBarGeometry, this.rackHorizontalBarMaterial, hBarMatrix.length) |
|
|
|
for (let i = 0; i < hBarMatrix.length; i++) { |
|
|
|
const hp = hBarMatrix[i] |
|
|
|
dummy.position.set(hp.x, hp.y, hp.z); |
|
|
|
dummy.rotation.set(hp.rx, hp.ry, hp.rz); |
|
|
|
dummy.scale.set(hp.sx, hp.sy, hp.sz); |
|
|
|
dummy.updateMatrix(); |
|
|
|
hBarMesh.setMatrixAt(i, dummy.matrix); |
|
|
|
dummy.position.set(hp.x, hp.y, hp.z) |
|
|
|
dummy.rotation.set(hp.rx, hp.ry, hp.rz) |
|
|
|
dummy.scale.set(hp.sx, hp.sy, hp.sz) |
|
|
|
dummy.updateMatrix() |
|
|
|
hBarMesh.setMatrixAt(i, dummy.matrix) |
|
|
|
} |
|
|
|
meshes.push(hBarMesh) |
|
|
|
} |
|
|
|
return meshes; |
|
|
|
return meshes |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
resetUVs(geometry) { |
|
|
|
if (geometry == undefined) return; |
|
|
|
const pos = geometry.getAttribute("position"), |
|
|
|
nor = geometry.getAttribute("normal"), |
|
|
|
uvs = geometry.getAttribute("uv"); |
|
|
|
resetUVs(geometry: THREE.ExtrudeGeometry) { |
|
|
|
if (geometry == undefined) return |
|
|
|
const pos = geometry.getAttribute('position'), |
|
|
|
nor = geometry.getAttribute('normal'), |
|
|
|
uvs = geometry.getAttribute('uv') |
|
|
|
|
|
|
|
for (let i = 0; i < pos.count; i++) { |
|
|
|
let x = 0, y = 0; |
|
|
|
let x = 0, y = 0 |
|
|
|
|
|
|
|
const nx = Math.abs(nor.getX(i)), ny = Math.abs(nor.getY(i)), nz = Math.abs(nor.getZ(i)); |
|
|
|
const nx = Math.abs(nor.getX(i)), ny = Math.abs(nor.getY(i)), nz = Math.abs(nor.getZ(i)) |
|
|
|
|
|
|
|
// if facing X
|
|
|
|
if (nx >= ny && nx >= nz) { |
|
|
|
x = pos.getZ(i); |
|
|
|
y = pos.getY(i); |
|
|
|
x = pos.getZ(i) |
|
|
|
y = pos.getY(i) |
|
|
|
} |
|
|
|
|
|
|
|
// if facing Y
|
|
|
|
if (ny >= nx && ny >= nz) { |
|
|
|
x = pos.getX(i); |
|
|
|
y = pos.getZ(i); |
|
|
|
x = pos.getX(i) |
|
|
|
y = pos.getZ(i) |
|
|
|
} |
|
|
|
|
|
|
|
// if facing Z
|
|
|
|
if (nz >= nx && nz >= ny) { |
|
|
|
x = pos.getX(i); |
|
|
|
y = pos.getY(i); |
|
|
|
x = pos.getX(i) |
|
|
|
y = pos.getY(i) |
|
|
|
} |
|
|
|
uvs.setXY(i, x, y); |
|
|
|
uvs.setXY(i, x, y) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|