You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
189 lines
4.8 KiB
JavaScript
189 lines
4.8 KiB
JavaScript
import * as THREE from "./lib/three.module.js";
|
|
import { PCDLoader } from "./lib/PCDLoader.js";
|
|
import { OrbitControls } from "./lib/OrbitControls.js";
|
|
import { SelectionBox } from "./lib/SelectionBox.js";
|
|
import { SelectionHelper } from "./lib/SelectionHelper.js";
|
|
|
|
var container;
|
|
var camera, controls, scene, renderer;
|
|
var camera;
|
|
|
|
var url_string = window.location.href;
|
|
var url = new URL(url_string);
|
|
//language
|
|
var pcd_file = url.searchParams.get("file");
|
|
|
|
init();
|
|
animate();
|
|
function init() {
|
|
document.body.addEventListener("keydown", (event) => {
|
|
if (event.ctrlKey && "asdv".indexOf(event.key) !== -1) {
|
|
event.preventDefault();
|
|
}
|
|
});
|
|
|
|
scene = new THREE.Scene();
|
|
|
|
renderer = new THREE.WebGLRenderer({ antialias: true });
|
|
renderer.setPixelRatio(window.devicePixelRatio);
|
|
|
|
camera = new THREE.PerspectiveCamera(
|
|
65,
|
|
window.innerWidth / window.innerHeight,
|
|
1,
|
|
800
|
|
);
|
|
camera.position.x = 0;
|
|
camera.position.z = 50;
|
|
camera.position.y = 0;
|
|
camera.up.set(0, 0, 1);
|
|
camera.lookAt(0, 0, 0);
|
|
|
|
controls = new OrbitControls(camera, renderer.domElement);
|
|
controls.addEventListener("change", render); // call this only in static scenes (i.e., if there is no animation loop)
|
|
|
|
container = document.createElement("container");
|
|
|
|
document.body.appendChild(container);
|
|
container.appendChild(renderer.domElement);
|
|
|
|
document.addEventListener("keydown", keydown);
|
|
|
|
scene.add(new THREE.AxesHelper(2));
|
|
|
|
onWindowResize();
|
|
window.addEventListener("resize", onWindowResize, false);
|
|
|
|
load_all();
|
|
|
|
render();
|
|
}
|
|
|
|
function load_all() {
|
|
load_pcd("pcd", pcd_file, 0xff0000);
|
|
}
|
|
|
|
function keydown(ev) {
|
|
switch (ev.key) {
|
|
case "+":
|
|
clouds["src"].material.size *= 1.2;
|
|
clouds["tgt"].material.size *= 1.2;
|
|
clouds["out"].material.size *= 1.2;
|
|
break;
|
|
case "-":
|
|
clouds["src"].material.size /= 1.2;
|
|
clouds["tgt"].material.size /= 1.2;
|
|
clouds["out"].material.size /= 1.2;
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onWindowResize() {
|
|
camera.aspect = window.innerWidth / window.innerHeight;
|
|
camera.updateProjectionMatrix();
|
|
renderer.setSize(window.innerWidth, window.innerHeight);
|
|
}
|
|
function animate() {
|
|
requestAnimationFrame(animate);
|
|
controls.update();
|
|
render();
|
|
}
|
|
|
|
function render() {
|
|
renderer.render(scene, camera);
|
|
}
|
|
|
|
function load_pcd(name, file, overall_color) {
|
|
var loader = new PCDLoader();
|
|
|
|
loader.load(file, function (pcd) {
|
|
var position = pcd.position;
|
|
var color = pcd.color;
|
|
var normal = pcd.normal;
|
|
// build geometry
|
|
var geometry = new THREE.BufferGeometry();
|
|
if (position.length > 0)
|
|
geometry.addAttribute(
|
|
"position",
|
|
new THREE.Float32BufferAttribute(position, 3)
|
|
);
|
|
if (normal.length > 0)
|
|
geometry.addAttribute(
|
|
"normal",
|
|
new THREE.Float32BufferAttribute(normal, 3)
|
|
);
|
|
if (color.length > 0)
|
|
geometry.addAttribute(
|
|
"color",
|
|
new THREE.Float32BufferAttribute(color, 3)
|
|
);
|
|
|
|
geometry.computeBoundingSphere();
|
|
// build material
|
|
|
|
var material = new THREE.PointsMaterial({ size: 0.005 });
|
|
|
|
if (color.length > 0) {
|
|
material.vertexColors = VertexColors;
|
|
} else {
|
|
material.color.setHex(overall_color);
|
|
}
|
|
|
|
//material.size = 0.1;
|
|
|
|
// build mesh
|
|
|
|
var mesh = new THREE.Points(geometry, material);
|
|
mesh.name = "pcd";
|
|
|
|
//return mesh;
|
|
|
|
scene.add(mesh);
|
|
|
|
//var center = points.geometry.boundingSphere.center;
|
|
//controls.target.set( center.x, center.y, center.z );
|
|
//controls.update();
|
|
});
|
|
}
|
|
|
|
var selectionBox = new SelectionBox(camera, scene);
|
|
var helper = new SelectionHelper(selectionBox, renderer, "selectBox");
|
|
document.addEventListener("mousedown", function (event) {
|
|
for (var item of selectionBox.collection) {
|
|
item.material.emissive.set(0x000000);
|
|
}
|
|
selectionBox.startPoint.set(
|
|
(event.clientX / window.innerWidth) * 2 - 1,
|
|
-(event.clientY / window.innerHeight) * 2 + 1,
|
|
0.5
|
|
);
|
|
});
|
|
document.addEventListener("mousemove", function (event) {
|
|
if (helper.isDown) {
|
|
for (var i = 0; i < selectionBox.collection.length; i++) {
|
|
selectionBox.collection[i].material.emissive.set(0x000000);
|
|
}
|
|
selectionBox.endPoint.set(
|
|
(event.clientX / window.innerWidth) * 2 - 1,
|
|
-(event.clientY / window.innerHeight) * 2 + 1,
|
|
0.5
|
|
);
|
|
var allSelected = selectionBox.select();
|
|
for (var i = 0; i < allSelected.length; i++) {
|
|
allSelected[i].material.emissive.set(0xffffff);
|
|
}
|
|
}
|
|
});
|
|
document.addEventListener("mouseup", function (event) {
|
|
selectionBox.endPoint.set(
|
|
(event.clientX / window.innerWidth) * 2 - 1,
|
|
-(event.clientY / window.innerHeight) * 2 + 1,
|
|
0.5
|
|
);
|
|
var allSelected = selectionBox.select();
|
|
for (var i = 0; i < allSelected.length; i++) {
|
|
allSelected[i].material.emissive.set(0xffffff);
|
|
}
|
|
});
|