以任何方式将高度设置为Shape

时间:2015-03-18 09:34:54

标签: java worldwind

我正在处理世界风,有一个表面椭圆,但我想设置这个椭圆的高度。

我尝试使用方法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);

1 个答案:

答案 0 :(得分:2)

Position确实需要elevation,这只是double,与altitude的意思相同(至少根据Position&# 39; s getters)。

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

  

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

需要注意的关键词是,"在Globe的表面地形上绘制"。您无法设置高程。它必须是该位置的地球表面的高度。所以你可以阅读它,但不能设置它。

我建议使用另一个类来塑造你的形状。围绕类继承结构反弹,你可以找到你想要的东西。

AbstractGeneralShape将其modelPosition记录为:

  

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

因此AbstractGeneralShape下的任何一个班级都有高度模式的概念。

AbstractShape也有altitudeMode,其下面是path,这是一个最终记录高度模式的课程。

Path将高度模式记录为:

  

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

为了做你想做的事,你需要确保你不在WorldWind.CLAMP_TO_GROUND高度模式。

考虑到这一点,请查看Ellipsoid

  

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

这是一个冗长的方式,说它的构造如下:

ellipsoid

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

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

您可能希望椭圆在内部打开。在三个维度中称为圆环。它们看起来像这样:

elliptical torus

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

我在API中最接近的是ExtrudedPolygon,它采用多边形并允许您添加高度。您可以自己定义多边形的形状。挤压形状如下所示:

extruded leaf

他们总是让我想起玩耍:

play doh factory

希望它有所帮助。