CullingVolume是CesiumJS中一个用于视锥体剔除(frustum culling)的类。剔除是一种先进的优化技术,可显著提高大规模3D场景的性能。
在3D场景中,一般需要渲染许多物体。然而,由于计算资源的限制,不能同时渲染所有物体。CullingVolume可以通过遮挡测试(occlusion testing)来排除不需要渲染的物体,从而提高渲染效率。
CullingVolume内部维护一个视锥体,在每帧渲染之前,会将当前场景中的所有物体与此视锥体进行比较。如果物体在视锥体之外,则认为它不在当前视口中,可以忽略它,从而减少渲染负担。
CullingVolume类的构造函数如下:
new CullingVolume([planes]);
其中,planes
是一个包含六个平面(left、right、bottom、top、near、far)的数组,用于描述视锥体。如果未指定planes
参数,则默认为单位立方体。
CullingVolume类有两个常用方法:computeVisibility
和getPlanes
。
这是CullingVolume最重要的方法,用于判断一个物体是否在当前视口中。
cullingVolume.computeVisibility(position, radius, occluder);
其中,position
是物体的位置,radius
是物体的半径(如果不存在,则传入0),occluder
是用于遮挡测试的Cesium.Occluder对象。
该方法返回一个枚举类型的值,表示物体是否可见,如下:
CullingVolume.VISIBLE
:物体完全在视锥体内。CullingVolume.INTERSECTING
:物体与视锥体相交。CullingVolume.NONE
:物体在视锥体之外。这个方法返回当前CullingVolume所对应的视锥体的六个平面。
var planes = cullingVolume.getPlanes();
返回的是一个包含六个平面(left、right、bottom、top、near、far)的数组。每个平面都是由Cartesian3
类型的normal
和distance
属性组成,表示平面的法向量和到原点的距离。
以下示例演示了如何使用CullingVolume进行视锥体剔除。
var viewer = new Cesium.Viewer('cesiumContainer');
var cullingVolume = new Cesium.CullingVolume();
viewer.scene.postRender.addEventListener(function() {
var center = viewer.camera.positionWC;
var sphere = new Cesium.BoundingSphere(center, 10000);
var occluder = new Cesium.Occluder(sphere, center);
var visibility = cullingVolume.computeVisibility(center, 0, occluder);
if (visibility !== Cesium.CullingVolume.NONE) {
// 在此处渲染需要显示的物体
}
});