mirror of https://gitee.com/cf-fz/WebCAD.git
parent
77f4e9bdd7
commit
242bac13b8
@ -0,0 +1,206 @@
|
||||
//相机控制
|
||||
import * as THREE from "three";
|
||||
import { Viewer } from '../GraphicsSystem/Viewer';
|
||||
import { ed, MouseMove } from '../ApplicationServices/Application';
|
||||
import { PlaneExt } from '../Geometry/Plane';
|
||||
import { Line3 } from 'three';
|
||||
|
||||
//控制类型
|
||||
enum CameraControlsEnabled
|
||||
{
|
||||
Rotate = 1,
|
||||
Zoom = 2,
|
||||
Pan = 4,
|
||||
}
|
||||
|
||||
//控制状态
|
||||
enum State
|
||||
{
|
||||
Null = 0, Pan = 1, Rotate = 2, Scale = 3
|
||||
}
|
||||
|
||||
|
||||
enum ButtonKey
|
||||
{
|
||||
Left = 0,
|
||||
Middle = 1,
|
||||
Right = 2,
|
||||
}
|
||||
|
||||
export class CameraControls
|
||||
{
|
||||
|
||||
m_domElement: HTMLElement;//HTMLDocument
|
||||
m_window: Window;
|
||||
|
||||
//起始点击.
|
||||
m_StartChickPoint: THREE.Vector3 = new THREE.Vector3();
|
||||
m_EndChickPoint: THREE.Vector3 = new THREE.Vector3();
|
||||
m_bKeyCtrlIsDown: boolean;
|
||||
//状态
|
||||
m_State: State = State.Null;
|
||||
m_SelectIng: boolean = false;
|
||||
m_Viewer: Viewer;
|
||||
|
||||
constructor(viewer: Viewer, domElement?: HTMLElement, docWindow?: Window)
|
||||
{
|
||||
this.m_Viewer = viewer;
|
||||
this.m_domElement = domElement;
|
||||
if (docWindow)
|
||||
{
|
||||
this.m_window = docWindow;
|
||||
}
|
||||
this.RegisterEvent();
|
||||
}
|
||||
|
||||
RegisterEvent()
|
||||
{
|
||||
if (this.m_domElement)
|
||||
{
|
||||
this.m_domElement.addEventListener("mousedown", this.onMouseDown, false)
|
||||
this.m_domElement.addEventListener("mousemove", this.onMouseMove, false)
|
||||
this.m_domElement.addEventListener("mouseup", this.onMouseUp, false)
|
||||
window.addEventListener("keydown", this.onKeyDown, false);
|
||||
window.addEventListener("keyup", this.onKeyUp, false);
|
||||
|
||||
this.m_domElement.addEventListener('wheel', this.onMouseWheel, false);
|
||||
}
|
||||
}
|
||||
|
||||
//鼠标
|
||||
onMouseDown = (event: MouseEvent) =>
|
||||
{
|
||||
event.preventDefault();
|
||||
let key: ButtonKey = event.button;
|
||||
this.m_StartChickPoint.set(event.offsetX, event.offsetY, 0);
|
||||
switch (key)
|
||||
{
|
||||
case ButtonKey.Left:
|
||||
{
|
||||
if (!this.m_SelectIng)
|
||||
{
|
||||
ed.m_SelectCss.SetStart(event.clientX, event.clientY)
|
||||
ed.m_SelectCss.SetEnd(event.clientX, event.clientY)
|
||||
ed.m_SelectCss.Show()
|
||||
}
|
||||
else
|
||||
{
|
||||
ed.m_SelectCss.Hide()
|
||||
|
||||
// let subVec = new THREE.Vector3(event.clientX - event.offsetX, event.clientY - event.offsetY, 0)
|
||||
// let startPt = new THREE.Vector3(Math.min(ed.m_SelectCss.start.x, ed.m_SelectCss.end.x),
|
||||
// Math.max(ed.m_SelectCss.start.y, ed.m_SelectCss.end.y),
|
||||
// 0
|
||||
// )
|
||||
// let endPt = new THREE.Vector3(Math.max(ed.m_SelectCss.start.x, ed.m_SelectCss.end.x),
|
||||
// Math.min(ed.m_SelectCss.start.y, ed.m_SelectCss.end.y),
|
||||
// 0
|
||||
// )
|
||||
// startPt.sub(subVec)
|
||||
// endPt.sub(subVec)
|
||||
// this.m_Viewer.ScreenToWorld(startPt)
|
||||
// this.m_Viewer.ScreenToWorld(endPt)
|
||||
|
||||
// ed.SelectWindow(startPt, endPt)
|
||||
|
||||
// let line = new Line(startPt, endPt)
|
||||
// db.appendEntity(line)
|
||||
}
|
||||
this.m_SelectIng = !this.m_SelectIng;
|
||||
break;
|
||||
}
|
||||
case ButtonKey.Middle:
|
||||
{
|
||||
if (this["Shift"])
|
||||
{
|
||||
this.m_State = State.Rotate;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.m_State = State.Pan;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ButtonKey.Right:
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
onMouseUp = (event: MouseEvent) =>
|
||||
{
|
||||
event.preventDefault();
|
||||
this.m_State = State.Null;
|
||||
}
|
||||
onMouseMove = (event: MouseEvent) =>
|
||||
{
|
||||
|
||||
event.preventDefault();
|
||||
this.m_EndChickPoint.set(event.offsetX, event.offsetY, 0);
|
||||
|
||||
let wpt = this.m_EndChickPoint.clone();
|
||||
this.m_Viewer.ScreenToWorld(wpt);
|
||||
let plan = new PlaneExt(new THREE.Vector3(0, 0, 1));
|
||||
let rs = new THREE.Vector3();
|
||||
plan.intersectLine(new Line3(wpt, wpt.clone().sub(this.m_Viewer.m_Direction)), rs, true);
|
||||
//Send
|
||||
// UiManage.setMouseCoord(wpt);
|
||||
|
||||
MouseMove(this.m_EndChickPoint)
|
||||
|
||||
if (this.m_SelectIng)
|
||||
{
|
||||
ed.m_SelectCss.SetEnd(event.clientX, event.clientY)
|
||||
}
|
||||
|
||||
let changeVec: THREE.Vector3 = new THREE.Vector3();
|
||||
changeVec.subVectors(this.m_EndChickPoint, this.m_StartChickPoint);
|
||||
this.m_StartChickPoint.copy(this.m_EndChickPoint);
|
||||
|
||||
if (this["Shift"] && this.m_State == State.Rotate)
|
||||
{
|
||||
this.m_Viewer.Rotate(changeVec);
|
||||
}
|
||||
switch (this.m_State)
|
||||
{
|
||||
case State.Pan:
|
||||
{
|
||||
this.m_Viewer.Pan(changeVec);
|
||||
break;
|
||||
}
|
||||
case State.Rotate:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case State.Scale:
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
onMouseWheel = (event: WheelEvent) =>
|
||||
{
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
|
||||
let pt = new THREE.Vector3();
|
||||
pt.set(event.offsetX, event.offsetY, 0);
|
||||
this.m_Viewer.ScreenToWorld(pt);
|
||||
if (event.deltaY < 0)
|
||||
{
|
||||
this.m_Viewer.Zoom(0.6, pt);
|
||||
} else if (event.deltaY > 0)
|
||||
{
|
||||
this.m_Viewer.Zoom(1.4, pt);
|
||||
}
|
||||
}
|
||||
//按键
|
||||
onKeyDown = (event: KeyboardEvent) =>
|
||||
{
|
||||
this[event.key] = true;
|
||||
}
|
||||
onKeyUp = (event: KeyboardEvent) =>
|
||||
{
|
||||
this[event.key] = false;
|
||||
}
|
||||
}
|
Loading…
Reference in new issue