import * as THREE from "./lib/three.module.js"; import { PCDLoader } from "./lib/PCDLoader.js"; import { OrbitControls } from "./lib/OrbitControls.js"; import { GUI } from "./lib/dat.gui.module.js"; import { TextFileLoader } from "./text_file_loader.js"; var container, stats; var camera, controls, scene, renderer; var camera; var params = { src: true, tgt: true, out: true, reload: load_all, }; var last_cloud_ind = { src: true, tgt: true, out: true, }; var clouds = {}; 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); init_gui(); //scene.add( new THREE.AxesHelper( 2 ) ); onWindowResize(); window.addEventListener("resize", onWindowResize, false); load_all(); render(); } function load_all() { clearAll(); load_pcd("src", "/temp/src.pcd", 0xff0000); load_pcd("tgt", "/temp/tgt.pcd", 0x00ff00); load_pcd("out", "/temp/out.pcd", 0xffff00); load_transform_matrix(); } function clearAll() { remove(clouds["src"]); remove(clouds["tgt"]); remove(clouds["out"]); clouds["src"] = null; clouds["tgt"] = null; clouds["our"] = null; function remove(p) { if (p) { scene.remove(p); p.geometry.dispose(); p.material.dispose(); } } } 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(); switch_cloud("src"); switch_cloud("tgt"); switch_cloud("out"); function switch_cloud(name) { if (params[name] != last_cloud_ind[name]) { last_cloud_ind[name] = params[name]; if (last_cloud_ind[name]) { scene.add(clouds[name]); } else { scene.remove(clouds[name]); } } } } function render() { renderer.render(scene, camera); } function load_transform_matrix() { var loader = new TextFileLoader(); loader.load("/temp/trans.json", function (json) { console.log(json); var mat = JSON.parse(json); var trans_html = ""; for (var i = 0; i < 4; i++) { trans_html += ""; for (var j = 0; j < 4; j++) trans_html += ""; trans_html += ""; } trans_html += "
" + mat[i * 4 + j] + "
"; document.getElementById("info").innerHTML = trans_html; }); } 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; if (params[name]) scene.add(mesh); clouds[name] = mesh; //var center = points.geometry.boundingSphere.center; //controls.target.set( center.x, center.y, center.z ); //controls.update(); }); } function init_gui() { var gui = new GUI(); var cfgFolder = gui.addFolder("View"); cfgFolder.add(params, "src"); cfgFolder.add(params, "tgt"); cfgFolder.add(params, "out"); cfgFolder.add(params, "reload"); cfgFolder.open(); gui.open(); }