PageSourceSearch

https://grandtuning.net/wp-content/plugins/woo-3d-viewer/includes/…/js/controls/OrbitControls.js?ver=1.8.6.3

js grandtuning.net collected 2026-10-09 01:22:25 UTC 22,492 bytes, 1,016 lines download raw bytes

vendor: 4,468 bytes, lines 1-155
1/**
2 * @author qiao / https://github.com/qiao
3 * @author mrdoob / http://mrdoob.com
4 * @author alteredq / http://alteredqualia.com/
5 * @author WestLangley / http://github.com/WestLangley
6 * @author erich666 / http://erichaines.com
7 */
8
9// This set of controls performs orbiting, dollying (zooming), and panning.
10// Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default).
11//
12//    Orbit - left mouse / touch: one finger move
13//    Zoom - middle mouse, or mousewheel / touch: two finger spread or squish
14//    Pan - right mouse, or arrow keys / touch: three finter swipe
15
16THREEW.OrbitControls = function ( object, domElement ) {
17
18	this.object = object;
19
20	this.domElement = ( domElement !== undefined ) ? domElement : document;
21
22	// Set to false to disable this control
23	this.enabled = true;
24
25	// "target" sets the location of focus, where the object orbits around
26	this.target = new THREEW.Vector3();
27
28	// How far you can dolly in and out ( PerspectiveCamera only )
29	this.minDistance = 0;
30	this.maxDistance = Infinity;
31
32	// How far you can zoom in and out ( OrthographicCamera only )
33	this.minZoom = 0;
34	this.maxZoom = Infinity;
35
36	// How far you can orbit vertically, upper and lower limits.
37	// Range is 0 to Math.PI radians.
38	this.minPolarAngle = 0; // radians
39	this.maxPolarAngle = Math.PI; // radians
40
41	// How far you can orbit horizontally, upper and lower limits.
42	// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].
43	this.minAzimuthAngle = - Infinity; // radians
44	this.maxAzimuthAngle = Infinity; // radians
45
46	// Set to true to enable damping (inertia)
47	// If damping is enabled, you must call controls.update() in your animation loop
48	this.enableDamping = false;
49	this.dampingFactor = 0.25;
50
51	// This option actually enables dollying in and out; left as "zoom" for backwards compatibility.
52	// Set to false to disable zooming
53	this.enableZoom = true;
54	this.zoomSpeed = 1.0;
55
56	// Set to false to disable rotating
57	this.enableRotate = true;
58	this.rotateSpeed = 1.0;
59
60	// Set to false to disable panning
61	this.enablePan = true;
62	this.keyPanSpeed = 7.0;	// pixels moved per arrow key push
63
64	// Set to true to automatically rotate around the target
65	// If auto-rotate is enabled, you must call controls.update() in your animation loop
66	this.autoRotate = false;
67	this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60
68
69	// Set to false to disable use of the keys
70	this.enableKeys = true;
71
72	// The four arrow keys
73	this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };
74
75	// Mouse buttons
76	this.mouseButtons = { ORBIT: THREEW.MOUSE.LEFT, ZOOM: THREEW.MOUSE.MIDDLE, PAN: THREEW.MOUSE.RIGHT };
77
78	// for reset
79	this.target0 = this.target.clone();
80	this.position0 = this.object.position.clone();
81	this.zoom0 = this.object.zoom;
82
83	//
84	// public methods
85	//
86
87	this.getPolarAngle = function () {
88
89		return spherical.phi;
90
91	};
92
93	this.getAzimuthalAngle = function () {
94
95		return spherical.theta;
96
97	};
98
99	this.reset = function () {
100
101		scope.target.copy( scope.target0 );
102		scope.object.position.copy( scope.position0 );
103		scope.object.zoom = scope.zoom0;
104
105		scope.object.updateProjectionMatrix();
106		scope.dispatchEvent( changeEvent );
107
108		scope.update();
109
110		state = STATE.NONE;
111
112	};
113
114	// this method is exposed, but perhaps it would be better if we can make it private...
115	this.update = function() {
116
117		var offset = new THREEW.Vector3();
118
119		// so camera.up is the orbit axis
120		var quat = new THREEW.Quaternion().setFromUnitVectors( object.up, new THREEW.Vector3( 0, 1, 0 ) );
121		var quatInverse = quat.clone().inverse();
122
123		var lastPosition = new THREEW.Vector3();
124		var lastQuaternion = new THREEW.Quaternion();
125
126		return function update () {
127
128			var position = scope.object.position;
129
130			offset.copy( position ).sub( scope.target );
131
132			// rotate offset to "y-axis-is-up" space
133			offset.applyQuaternion( quat );
134
135			// angle from z-axis around y-axis
136			spherical.setFromVector3( offset );
137
138			if ( scope.autoRotate && state === STATE.NONE ) {
139
140				rotateLeft( getAutoRotationAngle() );
141
142			}
143
144			spherical.theta += sphericalDelta.theta;
145			spherical.phi += sphericalDelta.phi;
146
147			// restrict theta to be between desired limits
148			spherical.theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, spherical.theta ) );
149
150			// restrict phi to be between desired limits
151			spherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );
152
153			spherical.makeSafe();
154
155
156			spherical.radius *= scale;
157
158			// restrict radius to be between desired limits
159			spherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );
160
161			// move target to panned location
162			scope.target.add( panOffset );
163
164			offset.setFromSpherical( spherical );
165
166			// rotate offset back to "camera-up-vector-is-up" space
167			offset.applyQuaternion( quatInverse );
168
169			position.copy( scope.target ).add( offset );
170
171			scope.object.lookAt( scope.target );
172
173			if ( scope.enableDamping === true ) {
174
175				sphericalDelta.theta *= ( 1 - scope.dampingFactor );
176				sphericalDelta.phi *= ( 1 - scope.dampingFactor );
177
178			} else {
179
180				sphericalDelta.set( 0, 0, 0 );
181
182			}
183
184			scale = 1;
185			panOffset.set( 0, 0, 0 );
186
187			// update condition is:
188			// min(camera displacement, camera rotation in radians)^2 > EPS
189			// using small-angle approximation cos(x/2) = 1 - x^2 / 8
190
191			if ( zoomChanged ||
192				lastPosition.distanceToSquared( scope.object.position ) > EPS ||
193				8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {
194
195				scope.dispatchEvent( changeEvent );
196
197				lastPosition.copy( scope.object.position );
198				lastQuaternion.copy( scope.object.quaternion );
199				zoomChanged = false;
200
201				return true;
202
203			}
204
205			return false;
206
207		};
208
209	}();
210
211	this.dispose = function() {
212
213		scope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );
214		scope.domElement.removeEventListener( 'mousedown', onMouseDown, false );
215		scope.domElement.removeEventListener( 'wheel', onMouseWheel, false );
216
217		scope.domElement.removeEventListener( 'touchstart', onTouchStart, false );
218		scope.domElement.removeEventListener( 'touchend', onTouchEnd, false );
219		scope.domElement.removeEventListener( 'touchmove', onTouchMove, false );
220
221		document.removeEventListener( 'mousemove', onMouseMove, false );
222		document.removeEventListener( 'mouseup', onMouseUp, false );
223
224		window.removeEventListener( 'keydown', onKeyDown, false );
225
226		//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?
227
228	};
229
230	//
231	// internals
232	//
233
234	var scope = this;
235
236	var changeEvent = { type: 'change' };
237	var startEvent = { type: 'start' };
238	var endEvent = { type: 'end' };
239
240	var STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 };
241
242	var state = STATE.NONE;
243
244	var EPS = 0.000001;
245
246	// current position in spherical coordinates
247	var spherical = new THREEW.Spherical();
248	var sphericalDelta = new THREEW.Spherical();
249
250	var scale = 1;
251	var panOffset = new THREEW.Vector3();
252	var zoomChanged = false;
253
254	var rotateStart = new THREEW.Vector2();
255	var rotateEnd = new THREEW.Vector2();
256	var rotateDelta = new THREEW.Vector2();
257
258	var panStart = new THREEW.Vector2();
259	var panEnd = new THREEW.Vector2();
260	var panDelta = new THREEW.Vector2();
261
262	var dollyStart = new THREEW.Vector2();
263	var dollyEnd = new THREEW.Vector2();
264	var dollyDelta = new THREEW.Vector2();
265
266	function getAutoRotationAngle() {
267
268		return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;
269
270	}
271
272	function getZoomScale() {
273
274		return Math.pow( 0.95, scope.zoomSpeed );
275
276	}
277
278	function rotateLeft( angle ) {
279
280		sphericalDelta.theta -= angle;
281
282	}
283
284	function rotateUp( angle ) {
285
286		sphericalDelta.phi -= angle;
287
288	}
289
290	var panLeft = function() {
291
292		var v = new THREEW.Vector3();
293
294		return function panLeft( distance, objectMatrix ) {
295
296			v.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix
297			v.multiplyScalar( - distance );
298
299			panOffset.add( v );
300
301		};
302
303	}();
304
305	var panUp = function() {
306
307		var v = new THREEW.Vector3();
308
309		return function panUp( distance, objectMatrix ) {
310
311			v.setFromMatrixColumn( objectMatrix, 1 ); // get Y column of objectMatrix
312			v.multiplyScalar( distance );
313
314			panOffset.add( v );
315
316		};
317
318	}();
319
320	// deltaX and deltaY are in pixels; right and down are positive
321	var pan = function() {
322
323		var offset = new THREEW.Vector3();
324
325		return function pan ( deltaX, deltaY ) {
326
327			var element = scope.domElement === document ? scope.domElement.body : scope.domElement;
328
329			if ( scope.object instanceof THREEW.PerspectiveCamera ) {
330
331				// perspective
332				var position = scope.object.position;
333				offset.copy( position ).sub( scope.target );
334				var targetDistance = offset.length();
335
336				// half of the fov is center to top of screen
337				targetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );
338
339				// we actually don't use screenWidth, since perspective camera is fixed to screen height
340				panLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );
341				panUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );
342
343			}
343 else if ( scope.object instanceof THREEW.OrthographicCamera ) {
344
345				// orthographic
346				panLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );
347				panUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );
348
349			} else {
350
351				// camera neither orthographic nor perspective
352				console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );
353				scope.enablePan = false;
354
355			}
356
357		};
358
359	}();
360
361	function dollyIn( dollyScale ) {
362
363		if ( scope.object instanceof THREEW.PerspectiveCamera ) {
364
365			scale /= dollyScale;
366
367		} else if ( scope.object instanceof THREEW.OrthographicCamera ) {
368
369			scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );
370			scope.object.updateProjectionMatrix();
371			zoomChanged = true;
372
373		} else {
374
375			console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );
376			scope.enableZoom = false;
377
378		}
379
380	}
381
382	function dollyOut( dollyScale ) {
383
384		if ( scope.object instanceof THREEW.PerspectiveCamera ) {
385
386			scale *= dollyScale;
387
388		} else if ( scope.object instanceof THREEW.OrthographicCamera ) {
389
390			scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );
391			scope.object.updateProjectionMatrix();
392			zoomChanged = true;
393
394		} else {
395
396			console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );
397			scope.enableZoom = false;
398
399		}
400
401	}
402
403	//
404	// event callbacks - update the object state
405	//
406
407	function handleMouseDownRotate( event ) {
408
409		//console.log( 'handleMouseDownRotate' );
410
411		rotateStart.set( event.clientX, event.clientY );
412
413	}
414
415	function handleMouseDownDolly( event ) {
416
417		//console.log( 'handleMouseDownDolly' );
418
419		dollyStart.set( event.clientX, event.clientY );
420
421	}
422
423	function handleMouseDownPan( event ) {
424
425		//console.log( 'handleMouseDownPan' );
426
427		panStart.set( event.clientX, event.clientY );
428
429	}
430
431	function handleMouseMoveRotate( event ) {
432
433		//console.log( 'handleMouseMoveRotate' );
434
435		rotateEnd.set( event.clientX, event.clientY );
436		rotateDelta.subVectors( rotateEnd, rotateStart );
437
438		var element = scope.domElement === document ? scope.domElement.body : scope.domElement;
439
440		// rotating across whole screen goes 360 degrees around
441		rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );
442
443		// rotating up and down along whole screen attempts to go 360, but limited to 180
444		rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );
445
446		rotateStart.copy( rotateEnd );
447
448		scope.update();
449
450	}
451
452	function handleMouseMoveDolly( event ) {
453
454		//console.log( 'handleMouseMoveDolly' );
455
456		dollyEnd.set( event.clientX, event.clientY );
457
458		dollyDelta.subVectors( dollyEnd, dollyStart );
459
460		if ( dollyDelta.y > 0 ) {
461
462			dollyIn( getZoomScale() );
463
464		} else if ( dollyDelta.y < 0 ) {
465
466			dollyOut( getZoomScale() );
467
468		}
469
470		dollyStart.copy( dollyEnd );
471
472		scope.update();
473
474	}
475
476	function handleMouseMovePan( event ) {
477
478		//console.log( 'handleMouseMovePan' );
479
480		panEnd.set( event.clientX, event.clientY );
481
482		panDelta.subVectors( panEnd, panStart );
483
484		pan( panDelta.x, panDelta.y );
485
486		panStart.copy( panEnd );
487
488		scope.update();
489
490	}
491
492	function handleMouseUp( event ) {
493
494		//console.log( 'handleMouseUp' );
495
496	}
497
498	function handleMouseWheel( event ) {
499
500		//console.log( 'handleMouseWheel' );
501
502		if ( event.deltaY < 0 ) {
503
504			dollyOut( getZoomScale() );
505
506		} else if ( event.deltaY > 0 ) {
507
508			dollyIn( getZoomScale() );
509
510		}
511
512		scope.update();
513
514	}
515
516	function handleKeyDown( event ) {
517
518		//console.log( 'handleKeyDown' );
519
520		switch ( event.keyCode ) {
521
522			case scope.keys.UP:
523				pan( 0, scope.keyPanSpeed );
524				scope.update();
525				break;
526
527			case scope.keys.BOTTOM:
528				pan( 0, - scope.keyPanSpeed );
529				scope.update();
530				break;
531
532			case scope.keys.LEFT:
533				pan( scope.keyPanSpeed, 0 );
534				scope.update();
535				break;
536
537			case scope.keys.RIGHT:
538				pan( - scope.keyPanSpeed, 0 );
539				scope.update();
540				break;
541
542		}
543
544	}
545
546	function handleTouchStartRotate( event ) {
547
548		//console.log( 'handleTouchStartRotate' );
549
550		rotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );
551
552	}
553
554	function handleTouchStartDolly( event ) {
555
556		//console.log( 'handleTouchStartDolly' );
557
558		var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;
559		var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;
560
561		var distance = Math.sqrt( dx * dx + dy * dy );
562
563		dollyStart.set( 0, distance );
564
565	}
566
567	function handleTouchStartPan( event ) {
568
569		//console.log( 'handleTouchStartPan' );
570
571		panStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );
572
573	}
574
575	function handleTouchMoveRotate( event ) {
576
577		//console.log( 'handleTouchMoveRotate' );
578
579		rotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );
580		rotateDelta.subVectors( rotateEnd, rotateStart );
581
582		var element = scope.domElement === document ? scope.domElement.body : scope.domElement;
583
584		// rotating across whole screen goes 360 degrees around
585		rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );
586
587		// rotating up and down along whole screen attempts to go 360, but limited to 180
588		rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );
589
590		rotateStart.copy( rotateEnd );
591
592		scope.update();
593
594	}
595
596	function handleTouchMoveDolly( event ) {
597
598		//console.log( 'handleTouchMoveDolly' );
599
600		var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;
601		var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;
602
603		var distance = Math.sqrt( dx * dx + dy * dy );
604
605		dollyEnd.set( 0, distance );
606
607		dollyDelta.subVectors( dollyEnd, dollyStart );
608
609		if ( dollyDelta.y > 0 ) {
610
611			dollyOut( getZoomScale() );
612
613		} else if ( dollyDelta.y < 0 ) {
614
615			dollyIn( getZoomScale() );
616
617		}
618
619		dollyStart.copy( dollyEnd );
620
621		scope.update();
622
623	}
624
625	function handleTouchMovePan( event ) {
626
627		//console.log( 'handleTouchMovePan' );
628
629		panEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );
630
631		panDelta.subVectors( panEnd, panStart );
632
633		pan( panDelta.x, panDelta.y );
634
635		panStart.copy( panEnd );
636
637		scope.update();
638
639	}
640
641	function handleTouchEnd( event ) {
642
643		//console.log( 'handleTouchEnd' );
644
645	}
646
647	//
648	// event handlers - FSM: listen for events and reset state
649	//
650
651	function onMouseDown( event ) {
652
653		if ( scope.enabled === false ) return;
654
655		event.preventDefault();
656
657		if ( event.button === scope.mouseButtons.ORBIT ) {
658
659			if ( scope.enableRotate === false ) return;
660
661			handleMouseDownRotate( event );
662
663			state = STATE.ROTATE;
664
665		} else if ( event.button === scope.mouseButtons.ZOOM ) {
666
667			if ( scope.enableZoom === false ) return;
668
669			handleMouseDownDolly( event );
670
671			state = STATE.DOLLY;
672
673		} else if ( event.button === scope.mouseButtons.PAN ) {
674
675			if ( scope.enablePan === false ) return;
676
677			handleMouseDownPan( event );
678
679			state = STATE.PAN;
680
681		}
682
683		if ( state !== STATE.NONE ) {
684
685			document.addEventListener( 'mousemove', onMouseMove, false );
686			document.addEventListener( 'mouseup', onMouseUp, false );
687
688			scope.dispatchEvent( startEvent );
689
690		}
691
692	}
693
694	function onMouseMove( event ) {
695
696		if ( scope.enabled === false ) return;
697
698		event.preventDefault();
699
700		if ( state === STATE.ROTATE ) {
701
702			if ( scope.enableRotate === false ) return;
703
704			handleMouseMoveRotate( event );
705
706		} else if ( state === STATE.DOLLY ) {
707
708			if ( scope.enableZoom === false ) return;
709
710			handleMouseMoveDolly( event );
711
712		} else if ( state === STATE.PAN ) {
713
714			if ( scope.enablePan === false ) return;
715
716			handleMouseMovePan( event );
717
718		}
719
720	}
721
722	function onMouseUp( event ) {
723
724		if ( scope.enabled === false ) return;
725
726		handleMouseUp( event );
727
728		document.removeEventListener( 'mousemove', onMouseMove, false );
729		document.removeEventListener( 'mouseup', onMouseUp, false );
730
731		scope.dispatchEvent( endEvent );
732
733		state = STATE.NONE;
734
735	}
736
737	function onMouseWheel( event ) {
738
739		if ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return;
740
741		event.preventDefault();
742		event.stopPropagation();
743
744		handleMouseWheel( event );
745
746		scope.dispatchEvent( startEvent ); // not sure why these are here...
747		scope.dispatchEvent( endEvent );
748
749	}
750
751	function onKeyDown( event ) {
752
753		if ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;
754
755		handleKeyDown( event );
756
757	}
758
759	function onTouchStart( event ) {
760
761		if ( scope.enabled === false ) return;
762
763		switch ( event.touches.length ) {
764
765			case 1:	// one-fingered touch: rotate
766
767				if ( scope.enableRotate === false ) return;
768
769				handleTouchStartRotate( event );
770
771				state = STATE.TOUCH_ROTATE;
772
773				break;
774
775			case 2:	// two-fingered touch: dolly
776
777				if ( scope.enableZoom === false ) return;
778
779				handleTouchStartDolly( event );
780
781				state = STATE.TOUCH_DOLLY;
782
783				break;
784
785			case 3: // three-fingered touch: pan
786
787				if ( scope.enablePan === false ) return;
788
789				handleTouchStartPan( event );
790
791				state = STATE.TOUCH_PAN;
792
793				break;
794
795			default:
796
797				state = STATE.NONE;
798
799		}
800
801		if ( state !== STATE.NONE ) {
802
803			scope.dispatchEvent( startEvent );
804
805		}
806
807	}
808
809	function onTouchMove( event ) {
810
811		if ( scope.enabled === false ) return;
812
813		event.preventDefault();
814		event.stopPropagation();
815
816		switch ( event.touches.length ) {
817
818			case 1: // one-fingered touch: rotate
819
820				if ( scope.enableRotate === false ) return;
821				if ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?...
822
823				handleTouchMoveRotate( event );
824
825				break;
826
827			case 2: // two-fingered touch: dolly
828
829				if ( scope.enableZoom === false ) return;
830				if ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?...
831
832				handleTouchMoveDolly( event );
833
834				break;
835
836			case 3: // three-fingered touch: pan
837
838				if ( scope.enablePan === false ) return;
839				if ( state !== STATE.TOUCH_PAN ) return; // is this needed?...
840
841				handleTouchMovePan( event );
842
843				break;
844
845			default:
846
847				state = STATE.NONE;
848
849		}
850
851	}
852
853	function onTouchEnd( event ) {
854
855		if ( scope.enabled === false ) return;
856
857		handleTouchEnd( event );
858
859		scope.dispatchEvent( endEvent );
860
861		state = STATE.NONE;
862
863	}
864
865	function onContextMenu( event ) {
866
867		event.preventDefault();
868
869	}
870
871	//
872
873	scope.domElement.addEventListener( 'contextmenu', onContextMenu, false );
874
875	scope.domElement.addEventListener( 'mousedown', onMouseDown, false );
876	scope.domElement.addEventListener( 'wheel', onMouseWheel, false );
877
878	scope.domElement.addEventListener( 'touchstart', onTouchStart, false );
879	scope.domElement.addEventListener( 'touchend', onTouchEnd, false );
880	scope.domElement.addEventListener( 'touchmove', onTouchMove, false );
881
882	window.addEventListener( 'keydown', onKeyDown, false );
883
884	// force an update at start
885
886	this.update();
887
888};
889
890THREEW.OrbitControls.prototype = Object.create( THREEW.EventDispatcher.prototype );
891THREEW.OrbitControls.prototype.constructor = THREEW.OrbitControls;
892
893Object.defineProperties( THREEW.OrbitControls.prototype, {
894
895	center: {
896
897		get: function () {
898
899			console.warn( 'THREEW.OrbitControls: .center has been renamed to .target' );
900			return this.target;
901
902		}
903
904	},
905
906	// backward compatibility
907
908	noZoom: {
909
910		get: function () {
911
912			console.warn( 'THREEW.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );
913			return ! this.enableZoom;
914
915		},
916
917		set: function ( value ) {
918
919			console.warn( 'THREEW.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );
920			this.enableZoom = ! value;
921
922		}
923
924	},
925
926	noRotate: {
927
928		get: function () {
929
930			console.warn( 'THREEW.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );
931			return ! this.enableRotate;
932
933		},
934
935		set: function ( value ) {
936
937			console.warn( 'THREEW.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );
938			this.enableRotate = ! value;
939
940		}
941
942	},
943
944	noPan: {
945
946		get: function () {
947
948			console.warn( 'THREEW.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );
949			return ! this.enablePan;
950
951		},
952
953		set: function ( value ) {
954
955			console.warn( 'THREEW.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );
956			this.enablePan = ! value;
957
958		}
959
960	},
961
962	noKeys: {
963
964		get: function () {
965
966			console.warn( 'THREEW.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );
967			return ! this.enableKeys;
968
969		},
970
971		set: function ( value ) {
972
973			console.warn( 'THREEW.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );
974			this.enableKeys = ! value;
975
976		}
977
978	},
979
980	staticMoving : {
981
982		get: function () {
983
984			console.warn( 'THREEW.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );
985			return ! this.enableDamping;
986
987		},
988
989		set: function ( value ) {
990
991			console.warn( 'THREEW.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );
992			this.enableDamping = ! value;
993
994		}
995
996	},
997
998	dynamicDampingFactor : {
999
1000		get: function () {
1001
1002			console.warn( 'THREEW.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );
1003			return this.dampingFactor;
1004
1005		},
1006
1007		set: function ( value ) {
1008
1009			console.warn( 'THREEW.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );
1010			this.dampingFactor = value;
1011
1012		}
1013
1014	}
1015
1016} );

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.