1

我有一个CesiumJS函数,我想在执行zoomTo()之后且仅在执行之后才执行该函数,这可以确保地形已完全加载(如文档中所述)!
这是因为这个函数实际上应该计算射线和地形之间的交集,所以地形必须完全加载才能成功执行。

在当前状态下,以下代码返回:null超快速(完全不等待地形):

例如:

var viewer = new Cesium.Viewer('cesiumContainer', {
    imageryProvider : new Cesium.BingMapsImageryProvider({
        url : 'https://dev.virtualearth.net',
        key : $(BING_KEY),
        mapStyle : Cesium.BingMapsStyle.AERIAL
    }),
    terrainProvider: new Cesium.CesiumTerrainProvider({
        url : 'https://api.maptiler.com/tiles/terrain-quantized-mesh/?key$(MKEY)'
    });
    baseLayerPicker : false,
    infoBox : false,
});

var p0 = [10.7465, 48.3147, 1500];
var p1 = [10.7475, 48.3127, 1000];
var start = new Cesium.Cartesian3.fromDegrees(...p0);
var end = new Cesium.Cartesian3.fromDegrees(...p1);

var entity = viewer.entities.add({
    polyline : {
        positions : Cesium.Cartesian3.fromDegreesArrayHeights([
            ...(p0.concat(p1))
        ]),
        width : 4,
        material : new Cesium.PolylineGlowMaterialProperty({
            glowPower : 1,
            color : Cesium.Color.GREEN
        })
    }
});

viewer.zoomTo(viewer.entities);

// then run this function:
function pickGlobeIntersection(viewer, p0, p1) {
      var direction = new Cesium.Cartesian3();
      Cesium.Cartesian3.subtract(p1, p0, direction);
      console.log("direction: ", direction);
      Cesium.Cartesian3.normalize(direction, direction);

      var ray = new Cesium.Ray(p0, direction);
      var hitPos = viewer.scene.globe.pick(ray, viewer.scene);

      if ((hitPos !== undefined) && (hitPos !== null)) {
        console.log("hitPos: ", hitPos);
        return hitPos;
      } else {
        console.log("hitPos is null!");
        return null;
      }
}

pickGlobeIntersection(viewer, start, end);

(如果在沙堡中使用代码,则将查看器替换为默认查看器)


如何确保仅在地形完全加载后才执行该功能?
4

0 回答 0