@sauskylark/potree
Version:
WebGL point cloud viewer
66 lines (47 loc) • 1.62 kB
JavaScript
import * as THREE from "../../libs/three.js/build/three.module.js";
export class PolygonClipVolume extends THREE.Object3D{
constructor(camera){
super();
this.constructor.counter = (this.constructor.counter === undefined) ? 0 : this.constructor.counter + 1;
this.name = "polygon_clip_volume_" + this.constructor.counter;
this.camera = camera.clone();
this.camera.rotation.set(...camera.rotation.toArray()); // [r85] workaround because camera.clone() doesn't work on rotation
this.camera.rotation.order = camera.rotation.order;
this.camera.updateMatrixWorld();
this.camera.updateProjectionMatrix();
this.camera.matrixWorldInverse.copy(this.camera.matrixWorld).invert();
this.viewMatrix = this.camera.matrixWorldInverse.clone();
this.projMatrix = this.camera.projectionMatrix.clone();
// projected markers
this.markers = [];
this.initialized = false;
}
addMarker() {
let marker = new THREE.Mesh();
let cancel;
let drag = e => {
let size = e.viewer.renderer.getSize(new THREE.Vector2());
let projectedPos = new THREE.Vector3(
2.0 * (e.drag.end.x / size.width) - 1.0,
-2.0 * (e.drag.end.y / size.height) + 1.0,
0
);
marker.position.copy(projectedPos);
};
let drop = e => {
cancel();
};
cancel = e => {
marker.removeEventListener("drag", drag);
marker.removeEventListener("drop", drop);
};
marker.addEventListener("drag", drag);
marker.addEventListener("drop", drop);
this.markers.push(marker);
}
removeLastMarker() {
if(this.markers.length > 0) {
this.markers.splice(this.markers.length - 1, 1);
}
}
};