|
@@ -82,11 +82,17 @@ export class FirstPersonControls extends EventDispatcher {
|
|
|
let camera = viewport.camera
|
|
|
let mode
|
|
|
if(e.isTouch){
|
|
|
- mode = e.touches.length == 1 ? (!e.drag.dragViewport || e.drag.dragViewport.name == 'MainView') ? 'rotate' : 'pan' : 'scale'
|
|
|
+ if(e.touches.length == 1){
|
|
|
+ mode = (!e.drag.dragViewport || e.drag.dragViewport.name == 'MainView') ? 'rotate' : 'pan'
|
|
|
+ }else if(e.touches.length == 2){
|
|
|
+ mode = 'scale'
|
|
|
+ }else{
|
|
|
+ mode = (!e.drag.dragViewport || e.drag.dragViewport.name == 'MainView') ? 'pan' : 'scale'
|
|
|
+ }
|
|
|
}else{
|
|
|
mode = e.buttons === Buttons.LEFT && (!e.drag.dragViewport || e.drag.dragViewport.name == 'MainView') ? 'rotate' : 'pan'
|
|
|
}
|
|
|
- console.log('mode ',mode )
|
|
|
+ //console.log('mode ', mode )
|
|
|
let moveSpeed = this.currentViewport.getMoveSpeed();
|
|
|
if (e.drag.startHandled === undefined) {///???????
|
|
|
e.drag.startHandled = true;
|
|
@@ -126,7 +132,7 @@ export class FirstPersonControls extends EventDispatcher {
|
|
|
}
|
|
|
|
|
|
|
|
|
- console.log('rotate:', this.pitchDelta, e.pointer.toArray(), this.pointerDragStart.toArray())
|
|
|
+ //console.log('rotate:', this.pitchDelta, e.pointer.toArray(), this.pointerDragStart.toArray())
|
|
|
|
|
|
|
|
|
this.pointerDragStart.copy(e.pointer)
|
|
@@ -171,7 +177,7 @@ export class FirstPersonControls extends EventDispatcher {
|
|
|
|
|
|
}else{
|
|
|
if(e.drag.intersectStart){//如果拖拽着点云
|
|
|
- console.log('pan 1')
|
|
|
+
|
|
|
if(e.drag.z == void 0){//拖拽开始
|
|
|
let pointerStartPos2d = e.drag.intersectStart.location.clone().project(camera);//识别到的点云点的位置
|
|
|
e.drag.z = pointerStartPos2d.z //记录z,保持拖拽物体到屏幕距离不变,所以z深度不变
|
|
@@ -196,9 +202,14 @@ export class FirstPersonControls extends EventDispatcher {
|
|
|
|
|
|
camera.projectionMatrixInverse = _projectionMatrixInverse
|
|
|
this.translationWorldDelta.copy(moveVec.negate()) //这里没法用add,原因未知,会跳动
|
|
|
-
|
|
|
+ //console.log('pan 1', this.translationWorldDelta.clone())
|
|
|
+ //四指松开剩三指时会偏移一下,暂不知道哪里的问题,或许跟开头防止点云吸附有关?
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
}else{ //如果鼠标没有找到和点云的交点,就假设移动整个模型(也可以去扩大范围寻找最近点云)
|
|
|
- console.log('pan 2')
|
|
|
+
|
|
|
/* let center = viewer.scene.pointclouds[0].position;
|
|
|
let radius = camera.position.distanceTo(center);
|
|
|
let ratio = radius * Math.tan(THREE.Math.degToRad(camera.fov)/2) / 1000 */
|
|
@@ -215,7 +226,7 @@ export class FirstPersonControls extends EventDispatcher {
|
|
|
let ratio = speed * Math.tan(fov/2)
|
|
|
this.translationDelta.x -= e.drag.pointerDelta.x * ratio
|
|
|
this.translationDelta.z -= e.drag.pointerDelta.y * ratio
|
|
|
-
|
|
|
+ //console.log('pan2', e.drag.pointerDelta)
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -250,6 +261,7 @@ export class FirstPersonControls extends EventDispatcher {
|
|
|
let dolly = (e={})=>{
|
|
|
|
|
|
if(this.currentViewport.unableChangePos){//全景时
|
|
|
+ this.emit('dollyStopCauseUnable',e)
|
|
|
return
|
|
|
}
|
|
|
|
|
@@ -346,21 +358,48 @@ export class FirstPersonControls extends EventDispatcher {
|
|
|
this.viewer.addEventListener('global_mousewheel', scroll);
|
|
|
this.viewer.addEventListener('global_dblclick', dblclick);
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+ let prepareScale = (e)=>{//触屏的scale
|
|
|
+ this.dollyStart.subVectors(e.touches[0].pointer, e.touches[1].pointer);
|
|
|
+ }
|
|
|
+ let prepareRotate = (e)=>{
|
|
|
+ this.pointerDragStart = e.pointer.clone()
|
|
|
+ }
|
|
|
+ let preparePan = (e)=>{//触屏的pan点云 还是会偏移
|
|
|
+
|
|
|
+ var pos2d = {
|
|
|
+ onlyGetIntersect : true,
|
|
|
+ clientX : e.touches[0].touch.pageX,
|
|
|
+ clientY : e.touches[0].touch.pageY,
|
|
|
+ }
|
|
|
+
|
|
|
+ var intersect = this.viewer.inputHandler.onMouseMove(pos2d)
|
|
|
+ e.drag.intersectStart = intersect
|
|
|
+ e.drag.z = void 0 //清空
|
|
|
+ e.drag.end.copy(e.pointer)
|
|
|
+ console.log('preparePan ' )
|
|
|
+ }
|
|
|
+
|
|
|
this.viewer.addEventListener('startDragging', (e)=>{
|
|
|
this.setCurrentViewport(e)
|
|
|
- this.pointerDragStart = e.pointer.clone()
|
|
|
+ prepareRotate(e)
|
|
|
})
|
|
|
this.viewer.addEventListener('global_touchstart', (e)=>{
|
|
|
if(e.touches.length==2){//只监听开头两个指头
|
|
|
- this.dollyStart.subVectors(e.touches[0].pointer, e.touches[1].pointer);
|
|
|
+ prepareScale(e)
|
|
|
}
|
|
|
})
|
|
|
this.viewer.addEventListener('global_touchend', (e)=>{
|
|
|
- if(e.touches.length==1){//停止scale,开始rotate
|
|
|
- this.pointerDragStart = e.pointer.clone()
|
|
|
+
|
|
|
+ if(e.touches.length==2){//停止平移,开始scale
|
|
|
+ prepareScale(e)
|
|
|
+ }else if(e.touches.length==1){//停止scale,开始rotate
|
|
|
+ prepareRotate(e)
|
|
|
//this.pointerDragStart = null
|
|
|
- console.log('只剩一个', e.pointer.toArray())
|
|
|
-
|
|
|
+ //console.log('只剩一个', e.pointer.toArray())
|
|
|
+ }else if(e.touches.length>=3){//重新准备下平移(因为抬起的指头可能包含平移使用的数据),否则抬起时漂移
|
|
|
+ preparePan(e)
|
|
|
}
|
|
|
})
|
|
|
|