Путь цезия на рельеф: линия, соединяющая 2 точки, проходит под рельефом

У меня есть путь, движущийся во времени. Я использую Cesium.sampleTerrain, чтобы получить высоту позиций и наложить их на ландшафт. Проблема в том, что даже если все точки находятся на местности, линия, соединяющая 2 точки, иногда уходит под местность. Как я могу сделать драпировку соединительных линий на местности?

Вот мой код:

var promise = Cesium.sampleTerrain(terrainProvider, 14, positions);
Cesium.when(promise, function(updatedPositions) {
    var cartesianPositions = Cesium.Ellipsoid.WGS84.cartographicArrayToCartesianArray(updatedPositions);
    var sample = new Cesium.SampledPositionProperty();
    sample.setInterpolationOptions({
        interpolationDegree : 3,
        interpolationAlgorithm : Cesium.HermitePolynomialApproximation
    });

    $(cartesianPositions).each(function(index, cartPosition) {
        var time = Cesium.JulianDate.addSeconds(start, index*10, new Cesium.JulianDate());
        sample.addSample(time, cartPosition);

    })

    var target = viewer.entities.add({
        position: sample,
          path: {
            resolution: 60,
            material:Cesium.Color.BLUE,
            width: 4,
            trailTime: 422*10,
            leadTime: 0
          }
    });

});

person sabrina    schedule 16.12.2015    source источник


Ответы (2)


Итак, как говорит Матфей; В настоящее время Cesium не поддерживает объект типа "полилиния" с драпировкой по поверхности.

Если вы обнаружите, что Entity API не дает вам того, что вам нужно, возможно, стоит покопаться в более низкоуровневом API Primitives, чтобы получить более точный контроль — в частности, GroundPrimitive геометрия.

Среди прочего; В настоящее время GroundPrimitives поддерживает CorridorGeometry.

У меня нет опыта построения графиков временных данных в Cesium, но я бы посоветовал вам рассмотреть этот подход, а не подход с асинхронным обещанием, который (IMO) кажется скорее хаком, рожденным из-за отсутствия решения типа GroundPrimitive в то время.

Вот грубый пример GroundPrimitive в действии (обратите внимание, что нам не нужны значения z):

var viewer = new Cesium.Viewer('cesiumContainer');

var corridorInstance = new Cesium.GeometryInstance({
   geometry : new Cesium.CorridorGeometry({
      vertexFormat : Cesium.VertexFormat.POSITION_ONLY,
      positions : Cesium.Cartesian3.fromDegreesArray([
         -122.26, 46.15,  
         -122.12, 46.26, 
      ]),
      width : 100
   }),
   id : 'myCorridor',
   attributes : {
      color : new Cesium.ColorGeometryInstanceAttribute(0.0, 1.0, 1.0, 0.5)
   }
});

var corridorPrimitive = new Cesium.GroundPrimitive({
   geometryInstance : corridorInstance
});

viewer.scene.primitives.add(corridorPrimitive);
viewer.camera.setView({
   destination: Cesium.Cartesian3.fromDegrees(-122.19, 46.20, 10000.0)
});

Что даст вам это:

введите здесь описание изображения

person danwild    schedule 16.12.2015

Cesium в настоящее время не поддерживает драпировку линий на местности, но он есть в нашей дорожной карте и очень важен для нас. На самом деле это чрезвычайно сложная проблема, которую нужно правильно решить во всех случаях (и она еще более сложна из-за ограничений WebGL). Это потребует большого количества исследований и экспериментов, и нет точных сроков, когда это будет завершено. У нас должна быть версия для статических линий к весне как часть нашей работы с 3D-тайлами, но динамические линии, вероятно, еще впереди.

Если вам интересно следить за развитием этой функции, следите за issue #2172. в нашем репозитории GitHub. Мы также сообщим в нашем блоге/твиттере/на форуме, когда эта функция станет частью официального релиза.

person Matthew Amato    schedule 16.12.2015