-
Notifications
You must be signed in to change notification settings - Fork 0
/
DragController.js
104 lines (92 loc) · 3.36 KB
/
DragController.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/**
* @author quinnciccoretti
* @author mrdoob
* @class DragController
* Grabs and throws objects
*/
class DragController extends BasicController {
constructor(id){
super( id, "#bb6600", "Drag");
//rays
var geometry = new THREE.BufferGeometry().setFromPoints( [ new THREE.Vector3( 0, 0, 0 ), new THREE.Vector3( 0, 0, - 1 ) ] );
var line = new THREE.Line( geometry );
line.name = 'line';
line.scale.z = 5;
this.add( line.clone() );
//touchpad ball
var geometry = new THREE.IcosahedronGeometry( 0.1, 2 );
var material = new THREE.MeshBasicMaterial({color:"#ff0000"});
//this shows where the user's thumb is on the trackpad
var ball = new THREE.Mesh( geometry, material );
this.ui.add( ball );
var object;
this.addEventListener( 'axischanged', this.onAxisChanged );
this.addEventListener( 'triggerup', this.onTriggerUp );
this.addEventListener( 'triggerdown', this.onTriggerDown );
}
onTriggerDown(){
var controller = this;
var intersections = getIntersections( controller );
if ( intersections.length > 0 ) {
var intersection = intersections[ 0 ];
tempMatrix.getInverse( controller.matrixWorld );
object = intersection.object;
object.matrix.premultiply( tempMatrix );
object.matrix.decompose( object.position, object.quaternion, object.scale );
controller.add( object );
controller.userData.selected = object;
}
}
onTriggerUp(){
var controller = this;
if ( controller.userData.selected !== undefined ) {
var object = controller.userData.selected;
object.matrix.premultiply( controller.matrixWorld );
object.matrix.decompose( object.position, object.quaternion, object.scale );
controller.remove(object); //remove from controller
scene.add(object); //reenable physics
if(typeof object.setLinearVelocity !== 'undefined'){
var velo = this.get_velocity();//returns a 3d float array
//set velocity proportional to distance between lifting object
//most realistic way
object.setLinearVelocity(velo.multiplyScalar(this.position.add(user.position).distanceTo(object.position)));
var angvelo = this.get_angular_velocity();
object.setAngularVelocity(angvelo.divideScalar(2));
}
controller.userData.selected = undefined;
}
}
getIntersections( controller ) {
tempMatrix.identity().extractRotation( controller.matrixWorld );
raycaster.ray.origin.setFromMatrixPosition( controller.matrixWorld );
raycaster.ray.direction.set( 0, 0, -1 ).applyMatrix4( tempMatrix );
return raycaster.intersectObjects( scene.children );
}
intersectObjects( controller ) {
// Do not highlight when already selected
if ( controller.userData.selected !== undefined ) return;
var line = controller.getObjectByName( 'line' );
var intersections = getIntersections( controller );
if ( intersections.length > 0 ) {
var intersection = intersections[ 0 ];
var object = intersection.object;
intersected.push( object );
line.scale.z = intersection.distance;
} else {
line.scale.z = 5;
}
}
cleanIntersected() {
while ( intersected.length ) {
var object = intersected.pop();
}
}
onAxisChanged( event ) {
if ( this.getButtonState( 'trigger' ) === false ) return;
// if ( this.getButtonState( 'tou' ) === false ) return;
var x = event.axes[ 0 ] / 2.0;
var y = - event.axes[ 1 ] / 2.0;
ball.position.set(0, event.axes[ 1 ], 0);
object.position.multiplyScalar(y*5);
}
}