【发布时间】:2014-08-18 22:55:46
【问题描述】:
我正在使用铯,并试图检测折线与地球上的地形相交的位置。我有一条折线,它从空中的某个点开始,以某个角度向地球绘制。
现在我只使用设定的距离计算终点,所以我有一个起点和终点。我想检测这条折线首先到达地球表面的位置并在该点停止绘制它。例如,如果有一座高山,我不希望线路在山的另一边继续。
我使用IntersectionTests 尝试了几种不同的方法,特别是grazingAltitudeLocation 和rayEllipsoid,但没有任何运气。我一直在用我的折线的起点和终点创建一条射线,然后在函数中使用 viewer.scene.globe.ellipsoid 作为椭圆体。我不断将起点作为交点返回。
有没有人知道我做错了什么,或者对不同的方法提出建议?任何帮助将不胜感激。
EDIT:这是编辑/添加的内容
这是我使用的代码,grazingAltitudeLocation 返回起点,rayEllipsoid 返回未定义。
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);
【问题讨论】:
-
计算交点的唯一目的是避免在地球表面下显示折线吗?你能用
rayEllipsoid显示你不成功的代码吗?如果您并不真正关心计算这一点,而只是想避免显示地球表面下方的折线部分,您是否尝试过Globe.depthTestAgainstTerrain? -
找到它的目的是用它作为折线的终点。 depthTestAgainstTerrain 确实可以在地球表面下不显示它,但如果它穿过一座山,它会继续在另一边绘制。我希望能够设置终点,这样它就停在山上。我已经添加了上面的代码。
-
Ray构造函数的第二个参数不应该是 -
...“方向”?这意味着 vector 方向:
end - start,在你的情况下,我想。这就是Ray参考所说的内容。 -
如果你找到了答案。请添加它作为问题的答案。谢谢。
标签: cesium