-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathoctree.js
More file actions
126 lines (91 loc) · 3.09 KB
/
octree.js
File metadata and controls
126 lines (91 loc) · 3.09 KB
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
var THREE = require('three');
var tree = require('../')();
var container, stats, particleArray;
var camera, scene, renderer, mouse = {x: 0, y: 0};
var raycaster = new THREE.Raycaster();
raycaster.params.PointCloud.threshold = 10;
init();
function init() {
container = document.getElementById('container');
camera = new THREE.PerspectiveCamera(27, window.innerWidth / window.innerHeight, 5, 3500);
camera.position.z = 2750;
scene = new THREE.Scene();
scene.fog = new THREE.Fog(0x050505, 2000, 3500);
var particles = 500000;
var geometry = new THREE.BufferGeometry();
var positions = new Float32Array(particles * 3);
var colors = new Float32Array(particles * 3);
var color = new THREE.Color();
var n = 1000,
n2 = n / 2; // particles spread in the cube
for (var i = 0; i < positions.length; i += 3) {
// positions
var x = Math.random() * n - n2;
var y = Math.random() * n - n2;
var z = Math.random() * n - n2;
positions[i] = x;
positions[i + 1] = y;
positions[i + 2] = z;
// colors
var vx = (x / n) + 0.5;
var vy = (y / n) + 0.5;
var vz = (z / n) + 0.5;
color.setRGB(vx, vy, vz);
colors[i] = color.r;
colors[i + 1] = color.g;
colors[i + 2] = color.b;
}
tree.initAsync(positions, listenToMouse);
geometry.addAttribute('position', new THREE.BufferAttribute(positions, 3));
geometry.addAttribute('color', new THREE.BufferAttribute(colors, 3));
geometry.computeBoundingSphere();
var material = new THREE.PointCloudMaterial({
size: 15,
vertexColors: THREE.VertexColors
});
particleSystem = new THREE.PointCloud(geometry, material);
scene.add(particleSystem);
particleArray = [particleSystem];
renderer = new THREE.WebGLRenderer({
antialias: false
});
renderer.setClearColor(scene.fog.color);
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
container.appendChild(renderer.domElement);
stats = new Stats();
stats.domElement.style.position = 'absolute';
stats.domElement.style.top = '0px';
container.appendChild(stats.domElement);
window.addEventListener('resize', onWindowResize, false);
}
function listenToMouse() {
animate();
document.body.addEventListener('mousemove', queryPoints);
}
function queryPoints(e) {
mouse.x = (e.clientX / renderer.domElement.clientWidth) * 2 - 1;
mouse.y = -(e.clientY / renderer.domElement.clientHeight) * 2 + 1;
raycaster.setFromCamera(mouse, camera);
var ray = raycaster.ray;
console.time('ray');
//var items = raycaster.intersectObjects(particleArray);
var items = tree.intersectRay(ray.origin, ray.direction);
console.timeEnd('ray');
}
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
}
function animate() {
requestAnimationFrame(animate);
render();
stats.update();
}
function render() {
var time = Date.now() * 0.001;
particleSystem.rotation.x = time * 0.25;
particleSystem.rotation.y = time * 0.5;
renderer.render(scene, camera);
}