3 changed files with 33 additions and 71 deletions
@ -1,56 +1,40 @@ |
|||||
import type Viewport from '@/designer/Viewport.ts' |
import type Viewport from '@/designer/Viewport.ts' |
||||
import type { ITool } from '@/designer/model2DEditor/tools/ITool.ts' |
import type { ITool } from '@/designer/model2DEditor/tools/ITool.ts' |
||||
|
|
||||
|
let pmFn |
||||
|
|
||||
/** |
/** |
||||
* 鼠标移动时,将鼠标位置的坐标转换为设计图上的坐标,并设置到 designer.mousePos 属性中 |
* 鼠标移动时,将鼠标位置的坐标转换为设计图上的坐标,并设置到 designer.mousePos 属性中 |
||||
*/ |
*/ |
||||
export default class MouseMoveInspect implements ITool { |
export default class MouseMoveInspect implements ITool { |
||||
viewport: Viewport |
viewport: Viewport |
||||
|
canvas: HTMLCanvasElement |
||||
|
|
||||
constructor() { |
constructor() { |
||||
} |
} |
||||
|
|
||||
init(viewport: Viewport) { |
init(viewport: Viewport) { |
||||
this.viewport = viewport |
this.viewport = viewport |
||||
const viewerDom = this.viewport.viewerDom |
this.canvas = this.viewport.renderer.domElement as HTMLCanvasElement |
||||
|
|
||||
viewerDom.addEventListener('mousemove', this.mouseMove.bind(this)) |
pmFn = this.mouseMove.bind(this) |
||||
|
this.canvas.addEventListener('pointermove', pmFn) |
||||
} |
} |
||||
|
|
||||
destory() { |
destory() { |
||||
const viewerDom = this.viewport.viewerDom |
this.canvas.removeEventListener('pointermove', pmFn) |
||||
viewerDom.removeEventListener('mousemove', this.mouseMove.bind(this)) |
pmFn = undefined |
||||
} |
} |
||||
|
|
||||
mouseMove = _.throttle(function(this: MouseMoveInspect, event: MouseEvent) { |
mouseMove = _.throttle(function(this: MouseMoveInspect, event: MouseEvent) { |
||||
const viewer = this.viewport.viewerDom |
// 当前鼠标所在的点
|
||||
// 获取鼠标在three.js 中的归一化坐标 取值范围是 (-1 to +1)
|
const point = this.viewport.getClosestIntersection(event) |
||||
const rect = viewer.getBoundingClientRect() |
if (!point) { |
||||
|
|
||||
this.viewport.state.mouse.leftPx = event.clientX - rect.left |
|
||||
this.viewport.state.mouse.topPx = event.clientY - rect.top |
|
||||
|
|
||||
this.viewport.state.mouse.posX = ((event.clientX - rect.left) / rect.width) * 2 - 1 |
|
||||
this.viewport.state.mouse.posZ = ((event.clientY - rect.top) / rect.height) * -2 + 1 |
|
||||
|
|
||||
const intersects = this.viewport.getGridHelpAtPosition({ |
|
||||
x: this.viewport.state.mouse.posX, |
|
||||
z: this.viewport.state.mouse.posZ |
|
||||
}) |
|
||||
if (!intersects || intersects.length < 2) { |
|
||||
this.viewport.state.mouse.x = NaN |
|
||||
this.viewport.state.mouse.z = NaN |
|
||||
return |
|
||||
} |
|
||||
|
|
||||
if (!_.every(intersects, (intersect) => intersect.object.type === 'GridHelper')) { |
|
||||
this.viewport.state.mouse.x = NaN |
|
||||
this.viewport.state.mouse.z = NaN |
|
||||
return |
return |
||||
} |
} |
||||
|
|
||||
this.viewport.state.mouse.x = Math.floor(intersects[0].point.x * 10) / 10 |
this.viewport.state.mouse.x = point.x |
||||
this.viewport.state.mouse.z = Math.floor(intersects[1].point.z * 10) / 10 |
this.viewport.state.mouse.z = point.z |
||||
|
|
||||
}, 1) |
}, 1) |
||||
} |
} |
||||
Loading…
Reference in new issue