NASA Worldwind:如何更改战术符号的速度领导者的颜色?

Posted

技术标签:

【中文标题】NASA Worldwind:如何更改战术符号的速度领导者的颜色?【英文标题】:NASA Worldwind: How can I change the color of the speed leader for tactical symbols? 【发布时间】:2017-09-13 05:58:57 【问题描述】:

在 NASA WorldWind 中,可以为 Milstd-2525 符号指定“行进方向”速度领导者。然而,这个速度领先者是黑色的,在深蓝色的海洋背景下很难看清。我尝试更改 TacticalSymbolAttributes 中的内部颜色材料,但这似乎没有效果(对任何东西)。不幸的是,该文档没有提供有关如何更改线条颜色的任何线索。

是否可以在 Worldwind 中更改 Milstd-2525 战术符号的速度领先线的颜色,如果可以,如何更改?

【问题讨论】:

您使用的是哪个版本的 WorldWind?即 1.X、2.0、2.0-986、2.1 2.1.0.我基本上一直在跟上 master git 分支。 【参考方案1】:

source codes of WorldWindJava on github 的基类 MilStd2525TacticalSymbol 覆盖名为 layoutDynamicModifiers 的方法。在此方法中,您可以看到对于DIRECTION_OF_MOVEMENT,最终只调用了addLine(...)(此方法在超类AbstractTacticalSymbol 中实现,它只在名为currentLines 的列表中添加一行)并且只能设置SPEED_LEADER_SCALE无法从外部更改移动方向的其他属性。

@Override
protected void layoutDynamicModifiers(DrawContext dc, AVList modifiers, OrderedSymbol osym)

    this.currentLines.clear();

    if (!this.isShowGraphicModifiers())
        return;

    // Direction of Movement indicator. Placed either at the center of the icon or at the bottom of the symbol
    // layout.
    Object o = this.getModifier(SymbologyConstants.DIRECTION_OF_MOVEMENT);
    if (o != null && o instanceof Angle)
    
        // The length of the direction of movement line is equal to the height of the symbol frame. See
        // MIL-STD-2525C section 5.3.4.1.c, page 33.
        double length = this.iconRect.getHeight();
        Object d = this.getModifier(SymbologyConstants.SPEED_LEADER_SCALE);
        if (d != null && d instanceof Number)
            length *= ((Number) d).doubleValue();

        if (this.useGroundHeadingIndicator)
        
            List<? extends Point2D> points = MilStd2525Util.computeGroundHeadingIndicatorPoints(dc, osym.placePoint,
                (Angle) o, length, this.iconRect.getHeight());
            this.addLine(dc, Offset.BOTTOM_CENTER, points, LAYOUT_RELATIVE, points.size() - 1, osym);
        
        else
        
            List<? extends Point2D> points = MilStd2525Util.computeCenterHeadingIndicatorPoints(dc,
                osym.placePoint, (Angle) o, length);
            this.addLine(dc, Offset.CENTER, points, null, 0, osym);
        
    

在超类AbstractTacticalSymbol 中,字段currentLines(包含移动方向的线)用于名为drawLines(...) 的方法中,该方法将添加的线绘制到提到的列表(类的线2366) .在第 2364 行中,您可以看到颜色设置为黑色。

gl.glColor4f(0f, 0f, 0f, opacity.floatValue()); 

现在我建议你扩展 MilStd2525TacticalSymbol 并执行以下操作:

    扩展类AbstractTacticalSymbol.Line并定义一些字段来存储颜色。 覆盖方法layoutDynamicModifiers 并获取您自己的密钥(例如DIRECTION_OF_MOVEMENT_COLOR)以从修饰符获取颜色并使用此给定颜色创建您自己的行并将其添加到currentLines 列表(您可以覆盖方法@987654342 @为此目的)。 最后覆盖drawLines,在你自己的Line类中使用store color,并在画线之前改变gl的颜色(你可以在画出移动方向后将背景颜色改为黑色)。

【讨论】:

【参考方案2】:

我正在使用早期的 Worldwind,但请尝试查看 AbstractTacticalSymbol.java -> drawLines() 方法。

在绘制线条之前将 glColor 默认设置为黑色。

【讨论】:

以上是关于NASA Worldwind:如何更改战术符号的速度领导者的颜色?的主要内容,如果未能解决你的问题,请参考以下文章

Java NASA Worldwind 多边形与内部边界

在 NASA Worldwind 中实现 XYZ 平铺层

Nasa worldwind - 地球动画结束后运行自定义函数

我想从我自己的服务器而不是 java worldwind 中的 nasa 服务器获取数据

[转]worldwind在线加载google地图,或者基于墨卡托投影的切片地图

worldwind java 文档和设置说明