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 { ITools } from '@/designer/model2DEditor/tools/ITools.ts' |
|||
|
|||
/** |
|||
* 鼠标移动时,将鼠标位置的坐标转换为设计图上的坐标,并设置到 designer.mousePos 属性中 |
|||
*/ |
|||
export default class MouseMoveInspect { |
|||
export default class MouseMoveInspect implements ITools { |
|||
viewport: Viewport |
|||
|
|||
constructor(viewport: Viewport) { |
|||
constructor() { |
|||
} |
|||
|
|||
init(viewport: Viewport) { |
|||
this.viewport = viewport |
|||
const viewerDom = this.viewport.viewerDom |
|||
|
|||
viewerDom.addEventListener('mousemove', this.mouseMove.bind(this)) |
|||
} |
|||
|
|||
mouseMove(event) { |
|||
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 |
|||
} |
|||
|
|||
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