Polyline Intersection With Terrain in Cesium -
i using cesium, , trying detect polyline intersects terrain on earth. have polyline begins @ point in air , drawn towards earth @ angle.
right calculating end point using set distance, have start , endpoint. want detect polyline first hits earth's surface , stop drawing @ point. example, if there tall mountain, don't want line continue on other side of mountain.
i've tried few different approaches using intersectiontests, grazingaltitudelocation , rayellipsoid have not had luck. have been creating ray start , end points of polyline , using viewer.scene.globe.ellipsoid ellipsoid in functions. keep getting starting point returned intersection point.
does have idea doing wrong, or suggestions on different way this? appreciated.
edit: edited/added content
here code used, grazingaltitudelocation returns start point , rayellipsoid returns undefined.
var viewer = new cesium.viewer('cesiumcontainer'); var scene = viewer.scene; var globe = scene.globe; var ellipsoid = scene.globe.ellipsoid; var primitives = scene.primitives; globe.depthtestagainstterrain = true; var cesiumterrainprovidermeshes = new cesium.cesiumterrainprovider({url : '//cesiumjs.org/stk-terrain/tilesets/world/tiles'}); scene.terrainprovider = cesiumterrainprovidermeshes; var startlon = -117.69; var startlat = 35.69; var startelv = 20000; var endlon = -120.0417; var endlat = 39.0917; var endelv = 0; var startcart = cesium.cartographic.fromdegrees(startlon, startlat, startelv); var start = ellipsoid.cartographictocartesian(startcart); var endcart = cesium.cartographic.fromdegrees(endlon, endlat, endelv); var end = ellipsoid.cartographictocartesian(endcart); var ray = new cesium.ray(start, end); var intersection = cesium.intersectiontests.grazingaltitudelocation(ray, ellipsoid); var intersection2 = cesium.intersectiontests.rayellipsoid(ray, ellipsoid); var point = cesium.ray.getpoint(ray, intersection2.start);
i think should picking on globe, not on ellipsoid. hope help:
function pickglobeintersection(viewer, p0, p1) { //all positions in cartesian3 var direction = new cesium.cartesian3(); cesium.cartesian3.subtract(p1, p0, 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)) { return hitpos; } else { return null; } } regards
Comments
Post a Comment