NASA Worldwind: Как я могу изменить цвет лидера скорости для тактических символов?

В NASA WorldWind можно назначить лидер скорости "направление движения" символам Milstd-2525. Тем не менее, этот лидер скорости черный, что делает его очень трудно увидеть на фоне синего океана. Я попытался изменить внутренний цветный материал в TacticalSymbolAttributes, но это, похоже, не имеет эффекта (ни на чем). К сожалению, документация не дает никаких подсказок о том, как изменить цвет линии.

Можно ли изменить цвет лидирующей линии скорости тактического символа Milstd-2525 в Worldwind, и если да, то как?

Ответ 1

База исходные коды WorldWindJava для github, класс MilStd2525TacticalSymbol отменяет метод с именем layoutDynamicModifiers. В этом методе вы можете видеть, что для DIRECTION_OF_MOVEMENT вызывается только addLine (...) (этот метод реализован в супер-calss 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 (вы можете переопределить метод addLine для этой цели).
  • наконец-то переопределить drawLines, чтобы использовать цвет магазина в вашем собственном классе Line и изменить цвет gl перед линией рисования (вы можете изменить цвет в черный цвет после направления движения).

Ответ 2

Я запускаю предыдущий Worldwind, но попробую взглянуть на метод AbstractTacticalSymbol.java → drawLines().

По умолчанию чернение glColor черное, прежде чем рисовать линии.