From 2c805788ae3be5e7ce3ff8d253098cc844cdb02d Mon Sep 17 00:00:00 2001 From: luoyifan Date: Tue, 17 Jun 2025 23:36:54 +0800 Subject: [PATCH] =?UTF-8?q?rack=20=E5=85=81=E8=AE=B8=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E5=92=8C=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/ModelUtils.ts | 15 ++++ src/core/ThreeExtend.ts | 15 +++- src/core/base/BaseRenderer.ts | 2 +- src/example/example1.js | 182 +++++++++++++++++++-------------------- src/modules/rack/RackRenderer.ts | 25 ++++-- src/types/ThreeExtend.d.ts | 4 + 6 files changed, 142 insertions(+), 101 deletions(-) diff --git a/src/core/ModelUtils.ts b/src/core/ModelUtils.ts index 3af8535..b89ba96 100644 --- a/src/core/ModelUtils.ts +++ b/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 对象 diff --git a/src/core/ThreeExtend.ts b/src/core/ThreeExtend.ts index 2ae3030..0d85cbc 100644 --- a/src/core/ThreeExtend.ts +++ b/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) } } diff --git a/src/core/base/BaseRenderer.ts b/src/core/base/BaseRenderer.ts index 972bbd2..57a15ad 100644 --- a/src/core/base/BaseRenderer.ts +++ b/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 } diff --git a/src/example/example1.js b/src/example/example1.js index a2f5d05..2d37c14 100644 --- a/src/example/example1.js +++ b/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 } + // } ] }, { diff --git a/src/modules/rack/RackRenderer.ts b/src/modules/rack/RackRenderer.ts index 68420e1..339f19f 100644 --- a/src/modules/rack/RackRenderer.ts +++ b/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 diff --git a/src/types/ThreeExtend.d.ts b/src/types/ThreeExtend.d.ts index 5abd705..17b83c0 100644 --- a/src/types/ThreeExtend.d.ts +++ b/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]]; + } }