@loaders.gl/3d-tiles
Version:
3D Tiles, an open standard for streaming massive heterogeneous 3D geospatial datasets.
55 lines (44 loc) • 1.73 kB
text/typescript
// loaders.gl
// SPDX-License-Identifier: MIT
// Copyright vis.gl contributors
import {Vector3} from '@math.gl/core';
import {OrientedBoundingBox, makeOrientedBoundingBoxFromPoints} from '@math.gl/culling';
import type {S2HeightInfo} from '../../utils/s2/index';
import {getS2OrientedBoundingBoxCornerPoints, getS2LngLat} from '../../utils/s2/index';
import {Ellipsoid} from '@math.gl/geospatial';
export type S2VolumeInfo = {
/** S2 key or token */
token: string;
/** minimum height in meters */
minimumHeight: number;
/** maximum height in meters */
maximumHeight: number;
};
/**
* Converts S2VolumeInfo to OrientedBoundingBox
* @param {S2VolumeInfo} s2VolumeInfo - s2 volume to convert
* @returns Oriented Bounding Box of type Box
*/
export function convertS2BoundingVolumetoOBB(s2VolumeInfo: S2VolumeInfo): number[] {
const token: string = s2VolumeInfo.token;
const heightInfo: S2HeightInfo = {
minimumHeight: s2VolumeInfo.minimumHeight,
maximumHeight: s2VolumeInfo.maximumHeight
};
const corners: Vector3[] = getS2OrientedBoundingBoxCornerPoints(token, heightInfo);
// Add a point that doesn't allow the box dive under the Earth
const center = getS2LngLat(token);
const centerLng: number = center[0];
const centerLat: number = center[1];
const point = Ellipsoid.WGS84.cartographicToCartesian([
centerLng,
centerLat,
heightInfo.maximumHeight
]);
const centerPointAdditional = new Vector3(point[0], point[1], point[2]);
corners.push(centerPointAdditional);
// corners should be an array of Vector3 (XYZ)
const obb: OrientedBoundingBox = makeOrientedBoundingBoxFromPoints(corners);
const box: number[] = [...obb.center, ...obb.halfAxes];
return box;
}