OrientedBoundingBox(面向包围盒)是一个包围盒,它可以沿任意方向进行轴对齐。它由一个中心点、三个半轴和一个方向组成。
使用以下代码创建一个面向包围盒:
const center = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883, 0);
const halfAxes = Cesium.Matrix3.fromScale(new Cesium.Cartesian3(5000.0, 5000.0, 5000.0), new Cesium.Matrix3());
const obb = new Cesium.OrientedBoundingBox(center, halfAxes);
这个OrientedBoundingBox的中心位置为经度为-75.59777
度,纬度为40.03883
度,高度为0。半轴向量的值为(5000.0, 5000.0, 5000.0)
,代表了其x、y、z方向上的缩放比例。
OrientedBoundingBox有以下属性:
center
:Cartesian3包围盒的中心点。
halfAxes
:Matrix3包围盒x、y、z方向的半轴向量,由于面向包围盒可以沿着任何方向进行轴对齐,所以它不是axis-aligned bounding box(AABB),而是oriented bounding box(OBB)。
direction
:Cartesian3面向包围盒的方向向量。
up
:Cartesian3面向包围盒的上向量。
right
:Cartesian3面向包围盒的右向量。
scale
:Cartesian3包围盒中x、y、z三个轴上的尺度值。
OrientedBoundingBox还提供了以下方法:
clone(): OrientedBoundingBox
返回一个 OrientedBoundingBox 与当前的OrientedBoundingBox相同。
intersectPlane(plane: Plane): Intersect
返回OrientedBoundingBox和平面的相交类型。
distanceSquaredTo(point: Cartesian3): number
返回给定点到包围盒的最短距离。
distanceToPoint(point: Cartesian3): number
返回给定点到包围盒的最短距离的平方。
computePlaneDistances(position: Cartesian3, direction: Cartesian3): Interval
计算关于给定线段的面向包围盒所跨越的最小距离间隔。
const viewer = new Cesium.Viewer('cesiumContainer');
const center = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883, 0);
const halfAxes = Cesium.Matrix3.fromScale(new Cesium.Cartesian3(5000.0, 5000.0, 5000.0), new Cesium.Matrix3());
const obb = new Cesium.OrientedBoundingBox(center, halfAxes);
const modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(center);
viewer.scene.primitives.add(Cesium.Model.fromGltf({
url: './path/to/model.gltf',
modelMatrix: modelMatrix,
// OrientedBoundingBox可以直接设置为模型的boundingVolume
boundingVolume: obb
}));