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