2015-12-16 6 views
1

У меня есть путь, движущийся со временем. Я использую Cesium.sampleTerrain, чтобы получить повышение позиции и задрапировать их на местности. Проблема в том, что даже если все точки находятся на местности, линия, соединяющая 2 точки, иногда проходит под рельефом. Как мне сделать, чтобы задрапировать и соединительные линии на местности?Цезиевый путь на местности: линия, соединяющая 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 
      } 
    }); 

}); 

ответ

1

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

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

2

Как говорит Матфей; В настоящее время цезий не поддерживает тип «полилинии» объект с драпировкой на местности.

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

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

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

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

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) 
}); 

Который даст вам:

enter image description here