我正在使用Cesium,并试图检测折线与地球上的地形相交的位置。我有一条折线,从空中的某个点开始,以一定角度向地球方向射出。
现在我正在使用设定距离计算终点,所以我有一个start和endPoint。我想检测这条折线首先撞击地球表面的位置,并在此时停止绘制它。例如,如果有一座高山,我不希望这条线继续在山的另一边。
我使用IntersectionTests
尝试了一些不同的方法,特别是grazingAltitudeLocation
和rayEllipsoid
,但没有任何运气。我一直用我的折线的起点和终点创建一条光线,然后使用viewer.scene.globe.ellipsoid
作为函数中的椭球。我一直把起点作为交点返回。
有没有人知道我做错了什么,或者以不同的方式提出建议?任何帮助将不胜感激。
编辑:这是经过编辑/添加的内容
以下是我使用的代码,grazingAltitudeLocation
返回起始点,rayEllipsoid
返回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);
答案 0 :(得分:1)
我认为你应该picking on Globe,而不是Ellipsoid。 希望这会有所帮助:
function pickGlobeIntersection(viewer, p0, p1) {
//all positions are 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;
}
}
此致