I have a simple three.js
graphics, and I tried to use the answers in this and this question to make the created plot zoomable by the mouse wheel. By using the mouse wheel I would like to zoom in to the graphics or to zoom out.
Here is the complete code: pastebin link
However, when turning the mouse wheel nothing happens, and I do not get an error message. Maybe I am missing something?
Advertisement
Answer
DEMO
JavaScript
x
108
108
1
var container, camera, scene, renderer, colors;
2
var selected = 0;
3
var selectedObject;
4
var objects = [];
5
6
// DOM element...
7
container = document.createElement('div');
8
document.body.appendChild(container);
9
10
// Camera...
11
camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 10000);
12
camera.position.set(0, 0, 150);
13
14
// Scene...
15
scene = new THREE.Scene();
16
scene.add(camera);
17
18
// Renderer...
19
renderer = new THREE.WebGLRenderer({
20
clearAlpha: 1
21
});
22
renderer.setSize(window.innerWidth, window.innerHeight);
23
renderer.setClearColor(0xffffff, 1);
24
document.body.appendChild(renderer.domElement);
25
26
// Scatter plot...
27
scatterPlot = new THREE.Object3D();
28
scene.add(scatterPlot);
29
30
// Plot some random points...
31
circle = new THREE.CircleGeometry(1, 20);
32
33
34
colors = [];
35
var max = 50;
36
var min = -50;
37
38
for (var i = 0; i < 10; i++) {
39
40
var object = new THREE.Mesh( circle.clone(), new THREE.MeshBasicMaterial( { color: new THREE.Color('black'), opacity: 0.5 } ) );
41
object.position.x = Math.random() * (max - min) + min;
42
object.position.y = Math.random() * (max - min) + min;
43
object.position.z = 0;
44
45
scene.add( object );
46
objects.push( object );
47
48
}
49
50
animate();
51
52
function animate() {
53
requestAnimationFrame(animate);
54
renderer.render(scene, camera);
55
}
56
57
raycaster = new THREE.Raycaster();
58
mouse = new THREE.Vector2();
59
document.addEventListener( 'mousedown', onDocumentMouseDown, false );
60
document.addEventListener( 'mousewheel', onDocumentMouseWheel, false );
61
62
function onDocumentMouseDown( event ) {
63
event.preventDefault();
64
mouse.x = ( event.clientX / renderer.domElement.clientWidth ) * 2 - 1;
65
mouse.y = - ( event.clientY / renderer.domElement.clientHeight ) * 2 + 1;
66
raycaster.setFromCamera( mouse, camera );
67
var intersects = raycaster.intersectObjects( objects );
68
if ( intersects.length > 0 ) {
69
//intersects[ 0 ].object.material.color.set('red');
70
//intersects[ 0 ].object.geometry.scale(1.1,1.1,1.1);
71
if (selected === 0) {
72
selected = 1;
73
selectedObject = intersects[ 0 ].object;
74
selectedObject.material.color.set('red');
75
console.log(selectedObject.position.x);
76
} else {
77
selected = 0;
78
var geometry = new THREE.Geometry();
79
geometry.vertices.push(intersects[ 0 ].object.position);
80
geometry.vertices.push(selectedObject.position);
81
var line = new THREE.Line(geometry, new THREE.LineBasicMaterial({ color: 0x0000ff }));
82
scene.add(line);
83
84
selectedObject.material.color.set('black');
85
}
86
87
}
88
}
89
90
function onWindowResize() {
91
camera.left = window.innerWidth / - 2;
92
camera.right = window.innerWidth / 2;
93
camera.top = window.innerHeight / 2;
94
camera.bottom = window.innerHeight / - 2;
95
camera.aspect = window.innerWidth / window.innerHeight;
96
97
renderer.setSize( window.innerWidth, window.innerHeight );
98
}
99
function onDocumentMouseWheel( event ) {
100
101
var fovMAX = 160;
102
var fovMIN = 1;
103
104
camera.fov -= event.wheelDeltaY * 0.05;
105
camera.fov = Math.max( Math.min( camera.fov, fovMAX ), fovMIN );
106
camera.projectionMatrix = new THREE.Matrix4().makePerspective(camera.fov, window.innerWidth / window.innerHeight, camera.near, camera.far);
107
108
}
JavaScript
1
2
1
body { margin: 0; }
2
canvas { width: 100%; height: 100% }
JavaScript
1
1
1
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/54/three.js"></script>
In your code add event listener
document.addEventListener( 'mousewheel', onDocumentMouseWheel, false );