Browse Source

Conveyor 输送线

master
修宁 7 months ago
parent
commit
d549332e69
  1. 11
      src/designer/Viewport.ts
  2. 4
      src/model/ModelUtils.ts
  3. 13
      src/model/WorldModel.ts
  4. 2
      src/model/itemType/ItemType.ts
  5. 10
      src/model/itemType/ItemTypeLine.ts
  6. 29
      src/model/itemType/line/conveyor/Conveyor.ts

11
src/designer/Viewport.ts

@ -14,6 +14,10 @@ import { getAllItemTypes } from '@/runtime/DefineItemType.ts'
import type { ItemTypeDefineOption } from '@/model/itemType/ItemTypeDefine.ts' import type { ItemTypeDefineOption } from '@/model/itemType/ItemTypeDefine.ts'
import type Toolbox from '@/model/itemType/Toolbox.ts' import type Toolbox from '@/model/itemType/Toolbox.ts'
import { calcPositionUseSnap } from '@/model/ModelUtils.ts' import { calcPositionUseSnap } from '@/model/ModelUtils.ts'
import textureUrl from '@/assets/images/conveyor/shapes/Belt1.png'
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'
/** /**
* *
@ -88,7 +92,7 @@ export default class Viewport {
this.worldModel.registerViewport(this) this.worldModel.registerViewport(this)
// 场景 // 场景
const scene = this.worldModel.getSceneByFloor(this.state.currentFloor) const scene = this.worldModel.getSceneByFloor(this, this.state.currentFloor)
this.scene = scene this.scene = scene
// 渲染器 // 渲染器
@ -303,12 +307,17 @@ export default class Viewport {
this.syncCameraState() this.syncCameraState()
} }
offset = 0
/** /**
* *
*/ */
animate() { animate() {
this.animationFrameId = requestAnimationFrame(this.animate.bind(this)) this.animationFrameId = requestAnimationFrame(this.animate.bind(this))
this.renderView() this.renderView()
this.offset -= 0.05
window['lineMaterial'].dashOffset = this.offset
} }
/** /**

4
src/model/ModelUtils.ts

@ -170,7 +170,7 @@ export function findObject3DByCondition(scene: THREE.Object3D, condition: (objec
return foundObjects return foundObjects
} }
export function loadSceneFromJson(scene: THREE.Scene, items: ItemJson[]) { export function loadSceneFromJson(viewport: Viewport, scene: THREE.Scene, items: ItemJson[]) {
console.time('loadSceneFromJson') console.time('loadSceneFromJson')
const object3ds: THREE.Object3D[] = [] const object3ds: THREE.Object3D[] = []
@ -194,7 +194,7 @@ export function loadSceneFromJson(scene: THREE.Scene, items: ItemJson[]) {
// afterAddScene 通知所有加载的对象, 模型加载完成 // afterAddScene 通知所有加载的对象, 模型加载完成
getAllItemTypes().forEach(itemType => { getAllItemTypes().forEach(itemType => {
itemType.clazz.afterAddScene(scene, object3ds) itemType.clazz.afterAddScene(viewport, scene, object3ds)
}) })
console.log('loadSceneFromJson:', items.length, 'items,', object3ds.length, 'objects') console.log('loadSceneFromJson:', items.length, 'items,', object3ds.length, 'objects')

13
src/model/WorldModel.ts

@ -62,7 +62,7 @@ export default class WorldModel {
}) })
} }
loadFloorToScene(scene: THREE.Scene, levelCode: string) { loadFloorToScene(viewport: Viewport, scene: THREE.Scene, levelCode: string) {
let floor = _.find(this.data.items, r => r.name === levelCode && r.t === 'floor') let floor = _.find(this.data.items, r => r.name === levelCode && r.t === 'floor')
if (!floor) { if (!floor) {
console.info(`新建楼层: ${levelCode}`) console.info(`新建楼层: ${levelCode}`)
@ -74,7 +74,7 @@ export default class WorldModel {
this.data.items.push(floor) this.data.items.push(floor)
} }
loadSceneFromJson(scene, floor.items) loadSceneFromJson(viewport, scene, floor.items)
} }
open() { open() {
@ -99,13 +99,12 @@ export default class WorldModel {
/** /**
* , * ,
* @param floor
*/ */
getSceneByFloor(floor: string) { getSceneByFloor(viewport: Viewport, floor: string) {
if (this.sceneMap.has(floor)) { if (this.sceneMap.has(floor)) {
return this.sceneMap.get(floor) return this.sceneMap.get(floor)
} else { } else {
const scene = this.createScene(floor) const scene = this.createScene(viewport, floor)
this.sceneMap.set(floor, scene) this.sceneMap.set(floor, scene)
return scene return scene
@ -115,11 +114,11 @@ export default class WorldModel {
/** /**
* *
*/ */
createScene(floor: string) { createScene(viewport: Viewport, floor: string) {
const scene = new Scene() const scene = new Scene()
scene.background = new THREE.Color(0xeeeeee) scene.background = new THREE.Color(0xeeeeee)
this.loadFloorToScene(scene, floor) this.loadFloorToScene(viewport, scene, floor)
return scene return scene
} }

2
src/model/itemType/ItemType.ts

@ -53,7 +53,7 @@ export default abstract class ItemType {
/** /**
* scene * scene
*/ */
afterAddScene(scene: THREE.Scene, objects: THREE.Object3D[]): void { afterAddScene(viewport:Viewport, scene: THREE.Scene, objects: THREE.Object3D[]): void {
} }
/** /**

10
src/model/itemType/ItemTypeLine.ts

@ -60,15 +60,19 @@ export default abstract class ItemTypeLine extends ItemType {
endPoint.userData.lines.push(line.uuid) endPoint.userData.lines.push(line.uuid)
this.afterCreateLine(line, startPoint, endPoint) this.afterCreateLine(line, startPoint, endPoint)
//@ts-ignore
if (typeof line.computeLineDistances === 'function') {
//@ts-ignore
line.computeLineDistances()
}
return line return line
} }
/** /**
* link 线 * link 线
*/ */
afterAddScene(scene: THREE.Scene, objects: THREE.Object3D[]) { afterAddScene(viewport: Viewport, scene: THREE.Scene, objects: THREE.Object3D[]) {
super.afterAddScene(scene, objects) super.afterAddScene(viewport, scene, objects)
// 为所有的 pointArray 连接线 // 为所有的 pointArray 连接线
for (let i = 0; i < this.pointArray.length; i++) { for (let i = 0; i < this.pointArray.length; i++) {

29
src/model/itemType/line/conveyor/Conveyor.ts

@ -25,27 +25,31 @@ export default class Conveyor extends ItemTypeLine {
this.pointMaterial = new THREE.MeshBasicMaterial({ color: 0x303133, transparent: true, opacity: 0.9 }) this.pointMaterial = new THREE.MeshBasicMaterial({ color: 0x303133, transparent: true, opacity: 0.9 })
this.lineMaterial = new LineMaterial({ this.lineMaterial = new LineMaterial({
alphaToCoverage: true,
side: THREE.DoubleSide,
color: 0x0088ff, color: 0x0088ff,
linewidth: 50, linewidth: 0.8,
vertexColors: false, // 关闭顶点颜色
dashed: true, dashed: true,
dashSize: 20, dashOffset: 0,
gapSize: 10, dashScale: 1,
alphaToCoverage: true dashSize: 0.2,
gapSize: 0.2,
worldUnits: true
}) })
window['lineMaterial'] = this.lineMaterial // 方便调试查看
} catch (error) { } catch (error) {
system.showErrorDialog('Texture loading failed:' + error) system.showErrorDialog('Texture loading failed:' + error)
} }
} }
afterAddScene(viewport: Viewport, scene: THREE.Scene, objects: THREE.Object3D[]) {
afterAddScene(scene: THREE.Scene, objects: THREE.Object3D[]) { super.afterAddScene(viewport, scene, objects)
super.afterAddScene(scene, objects) _.defer(() => {
const canvas = viewport.renderer.domElement
const geometry = new THREE.PlaneGeometry(10, 1) this.lineMaterial.resolution.set(canvas.width, canvas.height)
const beltMesh = new THREE.Mesh(geometry, this.lineMaterial) })
scene.add(beltMesh)
} }
getDefaultScale(): THREE.Vector3 { getDefaultScale(): THREE.Vector3 {
@ -89,6 +93,7 @@ export default class Conveyor extends ItemTypeLine {
obj.frustumCulled = false obj.frustumCulled = false
obj.name = Conveyor.LINE_NAME obj.name = Conveyor.LINE_NAME
obj.uuid = THREE.MathUtils.generateUUID() obj.uuid = THREE.MathUtils.generateUUID()
return obj return obj
} }
} }
Loading…
Cancel
Save