a couple quick and dirty function to impliment clamptoground for Billboard and PolyLine

Quick and dirty temp solution if anyone needs it

A Sandbox example using it is postered here

the code assumes that ‘scene’ and ‘ellipsoid’ are already defined along with terrainProvider

var interpolateCartographicLine = function (start, end, maxDistanceBetweenPoints) {

    var geodesic = new Cesium.EllipsoidGeodesic(start, end, ellipsoid),

        distance = geodesic.surfaceDistance,

        points = [start],

        stepCount,

        stepPercent,

        i ;

    

    if (distance> maxDistanceBetweenPoints && maxDistanceBetweenPoints > 0) {

        stepCount = Math.pow(2, Math.ceil(Math.log2(distance / maxDistanceBetweenPoints)));

        stepPercent = 1.0 / stepCount;

        for (i = 1; i < stepCount; i++) {

            points.push(geodesic.interpolateUsingFraction(i * stepPercent));

        }

    }

    points.push(end);

    return {points: points, distance: distance, stepCount: stepCount};

};

var clampToGroundBillboard = function (options) {

    var billboard = options.billboard,

        callBack = options.callBack || (function () { }),

        cartographic = ellipsoid.cartesianToCartographic(billboard.position);

    Cesium.when(Cesium.sampleTerrain(scene.terrainProvider, 14, [cartographic]),

                function (_billboard, _cartographic, _callBack) {

                    return function () {

                        _cartographic.height = _cartographic.height + 1;

                        _billboard.position = ellipsoid.cartographicToCartesian(_cartographic);

                        if (_callBack) {

                            _callBack(_billboard, _cartographic);

                        }

                    };

                }(billboard, cartographic, callBack)

            );

};

var clampToGroundPolyLine = function (options) {

    var polyLine = options.polyLine,

       callBack = options.callBack || (function () {}),

       org = ellipsoid.cartesianArrayToCartographicArray(polyLine.geometry._positions),

       loopCount = org.length - 1,

       cartos = [],

       newPoints, 

       i ;

    for (i = 0; i < loopCount  ; i++) {

        cartos.slice[0, -1]; 

        cartos = cartos.concat(interpolateCartographicLine(org[i], org[i + 1], 10).points); 

    }

    Cesium.when(Cesium.sampleTerrain(scene.terrainProvider, 12, cartos),

                 function (_polyLine, _cartographics, _callBack) {

                     return function () {

                         _polyLine.geometry._positions = ellipsoid.cartographicArrayToCartesianArray(_cartographics);

                         if (_callBack) {

                             _callBack(_polyLine, _cartographics);

                         }

                     };

                 }(polyLine, cartos, callBack)

             );

};