Browse Source

rack 允许修改属性和位置

master
修宁 6 months ago
parent
commit
2c805788ae
  1. 15
      src/core/ModelUtils.ts
  2. 15
      src/core/ThreeExtend.ts
  3. 2
      src/core/base/BaseRenderer.ts
  4. 182
      src/example/example1.js
  5. 25
      src/modules/rack/RackRenderer.ts
  6. 4
      src/types/ThreeExtend.d.ts

15
src/core/ModelUtils.ts

@ -651,6 +651,21 @@ export function getMatrixFromTf(tf: number[][], matrix = new THREE.Matrix4()): T
return matrix
}
export function getTfFromMatrix(matrix: THREE.Matrix4): [[number, number, number], [number, number, number], [number, number, number]] {
const pos = new THREE.Vector3()
const rot = new THREE.Euler()
const scale = new THREE.Vector3()
matrix.decompose(pos, new THREE.Quaternion().setFromRotationMatrix(matrix), scale)
rot.setFromQuaternion(new THREE.Quaternion().setFromRotationMatrix(matrix))
return [
[pos.x, pos.y, pos.z],
[THREE.MathUtils.radToDeg(rot.x), THREE.MathUtils.radToDeg(rot.y), THREE.MathUtils.radToDeg(rot.z)],
[scale.x, scale.y, scale.z]
]
}
/**
* AABBox
* @param matrix ItemJson

15
src/core/ThreeExtend.ts

@ -1,8 +1,19 @@
import * as THREE from 'three'
import { getMatrixFromTf, getTfFromMatrix } from '@/core/ModelUtils.ts'
export function install() {
THREE.Object3D.prototype.setMatrix4 = function(matrix: THREE.Matrix4) {
debugger
this.matrix.copy(matrix)
this.applyMatrix4(matrix)
// const pos = new THREE.Vector3()
// const rot = new THREE.Quaternion()
// const scale = new THREE.Vector3()
// matrix.decompose(pos, rot, scale)
// this.position.set(pos.x, pos.y, pos.z)
// this.rotation.setFromQuaternion(rot, 'XYZ')
// this.scale.set(scale.x, scale.y, scale.z)
}
THREE.Matrix4.prototype.toTf = function(matrix: THREE.Matrix4) {
return getTfFromMatrix(matrix)
}
}

2
src/core/base/BaseRenderer.ts

@ -237,7 +237,7 @@ export default abstract class BaseRenderer {
// if (point instanceof PointManageWrap) {
// point.manager.syncMeshObject3D(point)
// }
point.matrix = getMatrixFromTf(item.tf)
point.setMatrix4(getMatrixFromTf(item.tf))
return point
}

182
src/example/example1.js

@ -39,10 +39,8 @@ export default {
catalogCode: 'f1', t: 'floor', // 楼层
items: [
{
id: 'rack1',
t: 'rack',
v: true,
tf: [[2.9, 0.1, 3.5], [0, 0, 0], [1.5, 0.25, 0.1]],
id: 'rack1', t: 'rack', v: true,
tf: [[3, 0, 3], [0, 0, 0], [0.1, 0.1, 1]],
dt: {
rackDepth: 1, // 货架深度
rackWidth: 5.6,
@ -62,95 +60,95 @@ export default {
{ bayWidth: 1.4, levelHeight: [1.4, 1.4, 1.4] }
]
}
},
{
id: 'P1',
t: 'measure',
v: true,
tf: [[-4, 0.1, 4], [90, 0, 0], [0.25, 0.25, 0.1]],
dt: { in: [], out: [], center: ['P2'] }
},
{
id: 'P2',
t: 'measure',
v: true,
tf: [[5, 0.1, 4], [90, 0, 0], [0.25, 0.25, 0.1]],
dt: { in: [], out: [], center: ['P1', 'P3'] }
},
{
id: 'P3',
t: 'measure',
v: true,
tf: [[5, 0.1, 6.25], [90, 0, 0], [0.25, 0.25, 0.1]],
dt: { in: [], out: [], center: ['P2'] }
},
{
id: '39zML1rnSOOQGQYQ2YUMGy',
t: 'way',
v: true,
tf: [[-4, 0.1, 2], [90, 0, 0], [0.25, 0.25, 0.1]],
dt: { in: [], out: [], center: ['6wrGKiVJniwgKkoggOoEy6'] }
}, {
id: '6wrGKiVJniwgKkoggOoEy6',
t: 'way',
v: true,
tf: [[5, 0.1, 2], [90, 0, 0], [0.25, 0.25, 0.1]],
dt: { in: [], out: [], center: ['39zML1rnSOOQGQYQ2YUMGy'] }
}, {
id: 'gs1',
t: 'gstore',
v: true,
tf: [[-1, 0.1, -5.55], [0, 0, 0], [1, 0.1, 1]],
dt: { in: [], out: [], center: [] }
}, {
id: 'gs2',
t: 'gstore',
v: true,
tf: [[0.75, 0.1, -5.55], [0, 0, 0], [1, 0.1, 1]],
dt: { in: [], out: [], center: [] }
}, {
id: 'gs3',
t: 'gstore',
v: true,
tf: [[3, 0.1, -5.55], [0, 0, 0], [1, 0.1, 1]],
dt: { in: [], out: [], center: [] }
}, {
id: 'pallet1',
t: 'pallet',
v: true,
tf: [[0.75, 0.075, 0.55], [0, 0, 0], [1.0, 0.1, 1.2]],
dt: { in: [], out: [], center: [], palletWidth: 1, palletDepth: 1.2 }
}, {
id: 'pallet2',
t: 'pallet',
v: true,
tf: [[3, 0.075, 0.55], [0, 0, 0], [1.0, 0.1, 1.2]],
dt: { in: [], out: [], center: [], palletWidth: 1, palletDepth: 1.2 }
}, {
id: 'ptr1',
t: 'cl2',
v: true,
tf: [[0.75, 0.075, 2], [0, 0, 0], [1.5, 1.2, 0.1]],
dt: { in: [], out: [], center: [], ptrWidth: 1.5, ptrDepth: 1.5, ptrHeight: 1.98 }
}, {
id: 'ptr2',
t: 'cl2',
v: true,
tf: [[3, 0.075, 2], [0, 0, 0], [1.5, 1.2, 0.1]],
dt: { in: [], out: [], center: [], ptrWidth: 1.5, ptrDepth: 1.5, ptrHeight: 1.98 }
}, {
id: 'pallet3',
t: 'pallet',
v: true,
tf: [[3, 0.175, 1.88], [0, 0, 0], [1.5, 0.1, 1.2]],
dt: { in: [], out: [], center: [], palletWidth: 1, palletDepth: 1.2 }
}, {
id: 'pallet4',
t: 'pallet',
v: true,
tf: [[0.75, 0.175, 3.5], [0, 0, 0], [1.5, 0.1, 1.2]],
dt: { in: [], out: [], center: [], palletWidth: 1, palletDepth: 1.2 }
}
// {
// id: 'P1',
// t: 'measure',
// v: true,
// tf: [[-4, 0.1, 4], [90, 0, 0], [0.25, 0.25, 0.1]],
// dt: { in: [], out: [], center: ['P2'] }
// },
// {
// id: 'P2',
// t: 'measure',
// v: true,
// tf: [[5, 0.1, 4], [90, 0, 0], [0.25, 0.25, 0.1]],
// dt: { in: [], out: [], center: ['P1', 'P3'] }
// },
// {
// id: 'P3',
// t: 'measure',
// v: true,
// tf: [[5, 0.1, 6.25], [90, 0, 0], [0.25, 0.25, 0.1]],
// dt: { in: [], out: [], center: ['P2'] }
// },
// {
// id: '39zML1rnSOOQGQYQ2YUMGy',
// t: 'way',
// v: true,
// tf: [[-4, 0.1, 2], [90, 0, 0], [0.25, 0.25, 0.1]],
// dt: { in: [], out: [], center: ['6wrGKiVJniwgKkoggOoEy6'] }
// }, {
// id: '6wrGKiVJniwgKkoggOoEy6',
// t: 'way',
// v: true,
// tf: [[5, 0.1, 2], [90, 0, 0], [0.25, 0.25, 0.1]],
// dt: { in: [], out: [], center: ['39zML1rnSOOQGQYQ2YUMGy'] }
// }, {
// id: 'gs1',
// t: 'gstore',
// v: true,
// tf: [[-1, 0.1, -5.55], [0, 0, 0], [1, 0.1, 1]],
// dt: { in: [], out: [], center: [] }
// }, {
// id: 'gs2',
// t: 'gstore',
// v: true,
// tf: [[0.75, 0.1, -5.55], [0, 0, 0], [1, 0.1, 1]],
// dt: { in: [], out: [], center: [] }
// }, {
// id: 'gs3',
// t: 'gstore',
// v: true,
// tf: [[3, 0.1, -5.55], [0, 0, 0], [1, 0.1, 1]],
// dt: { in: [], out: [], center: [] }
// }, {
// id: 'pallet1',
// t: 'pallet',
// v: true,
// tf: [[0.75, 0.075, 0.55], [0, 0, 0], [1.0, 0.1, 1.2]],
// dt: { in: [], out: [], center: [], palletWidth: 1, palletDepth: 1.2 }
// }, {
// id: 'pallet2',
// t: 'pallet',
// v: true,
// tf: [[3, 0.075, 0.55], [0, 0, 0], [1.0, 0.1, 1.2]],
// dt: { in: [], out: [], center: [], palletWidth: 1, palletDepth: 1.2 }
// }, {
// id: 'ptr1',
// t: 'cl2',
// v: true,
// tf: [[0.75, 0.075, 2], [0, 0, 0], [1.5, 1.2, 0.1]],
// dt: { in: [], out: [], center: [], ptrWidth: 1.5, ptrDepth: 1.5, ptrHeight: 1.98 }
// }, {
// id: 'ptr2',
// t: 'cl2',
// v: true,
// tf: [[3, 0.075, 2], [0, 0, 0], [1.5, 1.2, 0.1]],
// dt: { in: [], out: [], center: [], ptrWidth: 1.5, ptrDepth: 1.5, ptrHeight: 1.98 }
// }, {
// id: 'pallet3',
// t: 'pallet',
// v: true,
// tf: [[3, 0.175, 1.88], [0, 0, 0], [1.5, 0.1, 1.2]],
// dt: { in: [], out: [], center: [], palletWidth: 1, palletDepth: 1.2 }
// }, {
// id: 'pallet4',
// t: 'pallet',
// v: true,
// tf: [[0.75, 0.175, 3.5], [0, 0, 0], [1.5, 0.1, 1.2]],
// dt: { in: [], out: [], center: [], palletWidth: 1, palletDepth: 1.2 }
// }
]
},
{

25
src/modules/rack/RackRenderer.ts

@ -10,6 +10,7 @@ import { InstancedMesh } from 'three/src/objects/InstancedMesh'
//@ts-ignore
import { mergeGeometries } from 'three/addons/utils/BufferGeometryUtils.js'
import type Viewport from '@/core/engine/Viewport.ts'
import type { Object3DLike } from '@/types/ModelTypes.ts'
/**
*
@ -122,6 +123,21 @@ export default class RackRenderer extends BaseRenderer {
}
}
updatePoint(item: ItemJson, group: THREE.Group, option?: RendererCudOption): THREE.Group {
group.position.set(item.tf[0][0], item.tf[0][1], item.tf[0][2])
group.rotation.set(
THREE.MathUtils.degToRad(item.tf[1][0]),
THREE.MathUtils.degToRad(item.tf[1][1]),
THREE.MathUtils.degToRad(item.tf[1][2])
)
// group.scale 不允许修改!!
// 禁止缩放,
item.tf[2][0] = item.dt.rackWidth
item.tf[2][1] = item.dt.rackHeight
return group
}
createPoint(item: ItemJson, option?: RendererCudOption): THREE.Object3D {
// 创建平面几何体
if (!item.dt.bays || !item.dt.rackDepth) {
@ -194,6 +210,7 @@ export default class RackRenderer extends BaseRenderer {
meshes.forEach(mesh => {
group.add(mesh)
mesh.instanceMatrix.needsUpdate = true
})
// 设置位置
@ -208,8 +225,8 @@ export default class RackRenderer extends BaseRenderer {
item.dt.rackWidth = rackWidth
item.dt.rackHeight = rackHeight
item.tf[2][0] = rackWidth
item.tf[2][1] = rackHeight
item.tf[2][0] = item.dt.rackWidth
item.tf[2][1] = item.dt.rackHeight
return group
}
@ -219,10 +236,6 @@ export default class RackRenderer extends BaseRenderer {
this.pointMaterial?.dispose()
}
createPointBasic(item: ItemJson, option?: RendererCudOption): THREE.Object3D {
throw new Error('Rack createPointBasic not allow!')
}
rackVerticalBarWidth = 0.1
rackVerticalBarDepth = 0.08
rackVerticalBarColor = 0xFF35499C

4
src/types/ThreeExtend.d.ts

@ -4,4 +4,8 @@ declare module 'three' {
interface Object3D {
setMatrix4(matrix: THREE.Matrix4): void;
}
interface Matrix4 {
toTf(matrix: THREE.Matrix4): [[number, number, number], [number, number, number], [number, number, number]];
}
}

Loading…
Cancel
Save