1

我正在研究世界风,有一个表面椭圆,但我想为这个椭圆设置一个高度。

我尝试使用方法moveTo,或者直接在构造函数中实例化一个elevation,但没有任何效果,我的形状仍然固定在这个星球上。

这是我创建形状的方法:

final SurfaceEllipse shape = new SurfaceEllipse();
shape.setRadii(100000, 100000);
shape.moveTo(Position.fromDegrees(50.0, 0.0, 50*20000)); // just a test
layer.addRenderable(shape);
4

1 回答 1

2

Position确实需要一个elevation,这只是 a并且与高度double相同(至少根据的吸气剂)。 Position

但是,SurfaceEllipse实现了SurfaceObject接口,该接口被记录为:

绘制在 Globe 表面地形上的可渲染对象的通用接口,例如 SurfaceShape。SurfaceObject 实现了 Renderable 和 PreRenderable 接口,因此表面对象可以在任何层或任意渲​​染代码中聚合。

这里要注意的关键词是“在地球表面地形上绘制”。不能设置高度。它必须是该位置的地球表面高度。所以你可以阅读它,但不能设置它。

我建议使用另一个类来塑造你的形状。围绕类继承结构反弹,您可能会找到一些可以做您想做的事情。

AbstractGeneralShape 将其modelPosition 记录为:

此形状的地理位置。高度与此形状高度模式有关。

所以下面的任何类AbstractGeneralShape都有海拔模式的概念。

AbstractShape也有altitudeMode,在它下面是path,一个最终记录高度模式的类。

路径文件高度模式为:

路径位置内的高度根据路径的高度模式进行解释。如果高度模式为 WorldWind.ABSOLUTE,则高度被视为高于椭球的高度。如果海拔模式为 WorldWind.RELATIVE_TO_GROUND,海拔将添加到该位置的地形海拔。如果高度模式为 WorldWind.CLAMP_TO_GROUND,则忽略高度。

所以要做你想做的事,你需要确保你没有处于WorldWind.CLAMP_TO_GROUND海拔模式。

考虑到这一点,看看Ellipsoid

由中心位置和三个椭球轴半径定义的一般椭球体积。如果A是南北方向的半径,b是东西方向的半径,c是垂直方向的半径(增加高度),那么A == B == C定义一个球体, A == B > C 定义一个垂直扁平的球体(圆盘形),A == B < C 定义一个垂直拉伸的球体。

这是一个冗长的方式来说它是这样构造的:

椭球体

使 C 足够小,并且可以很好地近似二维椭圆。

然而,它实际上仍然是三维的。我发现的大部分内容altitudeMode都是 3D,但Path除外。Path 有一些有趣的地形属性。

可能是你希望你的椭圆在里面是开放的。在三个维度上,这被称为环面。它们看起来像这样:

椭圆环面

不幸的是,我在 worldwind API 中找不到这种形状。但是,您可以从头开始创建自己的形状。 http://goworldwind.org/developers-guide/how-to-build-a-custom-renderable/

我在 API 中能找到的最接近的是ExtrudedPolygon,它采用多边形并允许您添加高度。由您来定义多边形的形状。挤出的形状如下所示:

挤压叶

他们总是让我想起 play doh:

玩豆工厂

希望能帮助到你。

于 2015-03-26T04:35:31.760 回答