UNPKG

@giro3d/giro3d

Version:

A JS/WebGL framework for 3D geospatial data visualization

64 lines 1.96 kB
import { Box3, Object3D, Vector3 } from 'three'; class OBB extends Object3D { isHelper = true; type = 'OBB'; constructor(min, max) { super(); this.box3D = new Box3(min.clone(), max.clone()); this.natBox = this.box3D.clone(); this.z = { min: 0, max: 0 }; this.topPointsWorld = [new Vector3(), new Vector3(), new Vector3(), new Vector3()]; this.update(); } clone() { const cOBB = new OBB(this.natBox.min, this.natBox.max); cOBB.position.copy(this.position); cOBB.quaternion.copy(this.quaternion); return cOBB; } updateMinMax(min, max) { this.box3D.min.copy(min); this.box3D.max.copy(max); this.natBox.copy(this.box3D); this.update(); } update() { this.updateMatrixWorld(true); this._cPointsWorld(this._points(this.topPointsWorld)); } updateZ(min, max) { this.z = { min, max }; this.box3D.min.z = this.natBox.min.z + min; this.box3D.max.z = this.natBox.max.z + max; this.update(); } _points(points) { // top points of bounding box points[0].set(this.box3D.max.x, this.box3D.max.y, this.box3D.max.z); points[1].set(this.box3D.min.x, this.box3D.max.y, this.box3D.max.z); points[2].set(this.box3D.min.x, this.box3D.min.y, this.box3D.max.z); points[3].set(this.box3D.max.x, this.box3D.min.y, this.box3D.max.z); // bottom points of bounding box if (points.length > 4) { points[4].set(this.box3D.max.x, this.box3D.max.y, this.box3D.min.z); points[5].set(this.box3D.min.x, this.box3D.max.y, this.box3D.min.z); points[6].set(this.box3D.min.x, this.box3D.min.y, this.box3D.min.z); points[7].set(this.box3D.max.x, this.box3D.min.y, this.box3D.min.z); } return points; } _cPointsWorld(points) { const m = this.matrixWorld; for (let i = 0, max = points.length; i < max; i++) { points[i].applyMatrix4(m); } return points; } } export default OBB;