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

NASA Worldwind: How can I change the color of the speed leader for tactical symbols?

在 NASA WorldWind 中,可以为 Milstd-2525 符号分配一个 "direction of travel" 速度领导者。然而,这个领航者是黑色的,在深蓝色的海洋背景下很难看清。我曾尝试更改 TacticalSymbolAttributes 中的内部颜色 material,但这似乎没有任何效果(对任何东西)。不幸的是,文档没有提供任何关于如何更改线条颜色的线索。

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

我 运行 关闭了较早的 Worldwind 但尝试查看 AbstractTacticalSymbol.java -> drawLines() 方法。

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

source codes of WorldWindJava on github, class MilStd2525TacticalSymbol 的基础覆盖名为 layoutDynamicModifiers 的方法。在这个方法中你可以看到对于 DIRECTION_OF_MOVEMENT 最终只有 addLine(...) 被调用(这个方法是在 superclass 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);
        }
    }
}

中超class AbstractTacticalSymbol, field currentLines (which contains the line for the direction of movement) is used in a method named drawLines(...) which draws added lines to the mentioned list (line 2366 of class)。在第 2364 行中,您可以看到颜色设置为黑色。

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

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

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