three
Version:
JavaScript 3D library
97 lines (71 loc) • 2.51 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 };