5 changed files with 127 additions and 15 deletions
@ -0,0 +1,5 @@ |
|||||
|
export interface ITools { |
||||
|
init(viewport: any): void |
||||
|
|
||||
|
destory(): void |
||||
|
} |
||||
@ -1,16 +1,56 @@ |
|||||
import Editor from '@/designer/Editor.js' |
|
||||
import type Viewport from '@/designer/Viewport.ts' |
import type Viewport from '@/designer/Viewport.ts' |
||||
|
import type { ITools } from '@/designer/model2DEditor/tools/ITools.ts' |
||||
|
|
||||
/** |
/** |
||||
* 鼠标移动时,将鼠标位置的坐标转换为设计图上的坐标,并设置到 designer.mousePos 属性中 |
* 鼠标移动时,将鼠标位置的坐标转换为设计图上的坐标,并设置到 designer.mousePos 属性中 |
||||
*/ |
*/ |
||||
export default class MouseMoveInspect { |
export default class MouseMoveInspect implements ITools { |
||||
viewport: Viewport |
viewport: Viewport |
||||
|
|
||||
constructor(viewport: Viewport) { |
constructor() { |
||||
|
} |
||||
|
|
||||
|
init(viewport: Viewport) { |
||||
this.viewport = viewport |
this.viewport = viewport |
||||
|
const viewerDom = this.viewport.viewerDom |
||||
|
|
||||
|
viewerDom.addEventListener('mousemove', this.mouseMove.bind(this)) |
||||
|
} |
||||
|
|
||||
|
destory() { |
||||
|
const viewerDom = this.viewport.viewerDom |
||||
|
viewerDom.removeEventListener('mousemove', this.mouseMove.bind(this)) |
||||
|
} |
||||
|
|
||||
|
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 |
||||
} |
} |
||||
|
|
||||
mouseMove(event) { |
if (!_.every(intersects, (intersect) => intersect.object.type === 'GridHelper')) { |
||||
|
this.viewport.state.mouse.x = NaN |
||||
|
this.viewport.state.mouse.z = NaN |
||||
|
return |
||||
} |
} |
||||
|
|
||||
|
this.viewport.state.mouse.x = Math.floor(intersects[0].point.x * 10) / 10 |
||||
|
this.viewport.state.mouse.z = Math.floor(intersects[0].point.z * 10) / 10 |
||||
|
|
||||
|
}, 1) |
||||
} |
} |
||||
Loading…
Reference in new issue