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); } });