@openhps/core
Version:
Open Hybrid Positioning System - Core component
84 lines (80 loc) • 2.56 kB
JavaScript
import { Line } from '../objects/Line.js';
import { Mesh } from '../objects/Mesh.js';
import { LineBasicMaterial } from '../materials/LineBasicMaterial.js';
import { MeshBasicMaterial } from '../materials/MeshBasicMaterial.js';
import { Float32BufferAttribute } from '../core/BufferAttribute.js';
import { BufferGeometry } from '../core/BufferGeometry.js';
/**
* A helper object to visualize an instance of {@link Plane}.
*
* ```js
* const plane = new THREE.Plane( new THREE.Vector3( 1, 1, 0.2 ), 3 );
* const helper = new THREE.PlaneHelper( plane, 1, 0xffff00 );
* scene.add( helper );
* ```
*
* @augments Line
*/
class PlaneHelper extends Line {
/**
* Constructs a new plane helper.
*
* @param {Plane} plane - The plane to be visualized.
* @param {number} [size=1] - The side length of plane helper.
* @param {number|Color|string} [hex=0xffff00] - The helper's color.
*/
constructor(plane, size = 1, hex = 0xffff00) {
const color = hex;
const positions = [1, -1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0];
const geometry = new BufferGeometry();
geometry.setAttribute('position', new Float32BufferAttribute(positions, 3));
geometry.computeBoundingSphere();
super(geometry, new LineBasicMaterial({
color: color,
toneMapped: false
}));
this.type = 'PlaneHelper';
/**
* The plane being visualized.
*
* @type {Plane}
*/
this.plane = plane;
/**
* The side length of plane helper.
*
* @type {number}
* @default 1
*/
this.size = size;
const positions2 = [1, 1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0];
const geometry2 = new BufferGeometry();
geometry2.setAttribute('position', new Float32BufferAttribute(positions2, 3));
geometry2.computeBoundingSphere();
this.add(new Mesh(geometry2, new MeshBasicMaterial({
color: color,
opacity: 0.2,
transparent: true,
depthWrite: false,
toneMapped: false
})));
}
updateMatrixWorld(force) {
this.position.set(0, 0, 0);
this.scale.set(0.5 * this.size, 0.5 * this.size, 1);
this.lookAt(this.plane.normal);
this.translateZ(-this.plane.constant);
super.updateMatrixWorld(force);
}
/**
* Updates the helper to match the position and direction of the
* light being visualized.
*/
dispose() {
this.geometry.dispose();
this.material.dispose();
this.children[0].geometry.dispose();
this.children[0].material.dispose();
}
}
export { PlaneHelper };