Occluder(遮挡物)用于控制场景中的遮挡效果,可以控制模型、平面、墙体等遮挡物对场景中其他物体的遮挡效果,从而在性能允许的情况下增加场景的真实感和细节。
CesiumJS中,可以通过定义一个Entity实体对象作为遮挡物,并使用Occluder实例给这个Entity添加遮挡,实现遮挡效果。
一个典型的Entity示例:
var entity = viewer.entities.add({
position : Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883),
billboard : {
image : 'icon.png'
}
});
要让该Entity成为一个遮挡物,需要使用Occluder实例并添加至该Entity中:
var occluder = new Cesium.Occluder(entity);
对于一个Occluder对象,可以通过以下方法对其进行配置:
用于设置遮挡物的包围球(Bounding Sphere),即实现对Scene中物体的遮挡。Cesium.Occluder的默认包围球是由该Entity的geometry计算得到的。
var entity = viewer.entities.add({
position : Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883),
model : {
uri : 'model.glb'
}
});
var occluder = new Cesium.Occluder(entity);
occluder.setBoundingSphere(entity.boundingSphere); // 使用 Entity 的包围球
用于设置遮挡物的多边形(Polygon)。
首先需要配置Cesium.Ray与Cesium.Matrix4以供后续计算。然后通过setPolygon方法将多边形传递给Occluder进行设置。
var occluder = new Cesium.Occluder(entity);
var rays = ...; // 从当前视图的摄像机位置射出的多边形交点,参见“计算多边形”部分
var depth = 100.0; // 多边形的深度值
var modelMatrix = ...; // 该Entity的模型矩阵
occluder.setPolygon(rays, depth, modelMatrix);
用于计算遮挡物相关的矩阵、数据等。在设置完遮挡物的包围球和多边形之后,需要手动调用compute方法进行计算。
occluder.compute(scene.camera.positionWC); // 计算,并传递摄像机位置至该方法中
在使用Occluder对象时,需要为遮挡物设置一个多边形,用于计算遮挡。在计算该多边形时,需要使用以下过程:
代码示例:
var maxDistance = 1000000.0; // 遮挡物的最大长度
var rays = [];
for (var i = 0; i < polygonPositions.length; i++) {
var endPt = polygonPositions[i];
var startPt = Cesium.Cartesian3.add(endPt, Cesium.Cartesian3.UNIT_Z, new Cesium.Cartesian3()); // Z轴方向空间偏移
var ray = new Cesium.Ray(startPt, Cesium.Cartesian3.subtract(endPt, startPt, new Cesium.Cartesian3()));
rays.push(ray);
}
var intersections = [];
for (var i = 0; i < rays.length; i++) {
var result = scene.globe.pick(rays[i], scene);
if (result) {
// TODO: 计算结果点
}
}
return intersections;
官方文档:https://cesium.com/docs/cesiumjs-ref-doc/Occluder.html
本文档由机器人Assist编写,如有疏漏或错误,请谅解。