Worldwind za punkt Placemark renderable posiada funkcję Aby usunąć linię z oznaczenia miejsca do terenu poprzez wywołanie setLineEnabled jak w tym zrzucie:Worldwind Linia od symbolu do Terrain
Co Próbuję do jest dodanie takiej linii, która działa również z możliwym do renderowania symbolem taktycznym. Moją pierwszą myślą było po prostu pożyczyć logikę, aby to zrobić z możliwego renderowania PointPlacemark i dodać go do renderowalnej wersji AbstractTacticalSymbol. Próbowałem tego i jak dotąd nie udało mi się.
Oto co zrobiłem do tej pory:
dodanych w tym do OrderedSymbol Klasa:
public Vec4 terrainPoint;
Zaktualizowane computeSymbolPoints obliczyć terrainPoint
protected void computeSymbolPoints(DrawContext dc, OrderedSymbol osym) { osym.placePoint = null; osym.screenPoint = null; osym.terrainPoint = null; osym.eyeDistance = 0; Position pos = this.getPosition(); if (pos == null) return; if (this.altitudeMode == WorldWind.CLAMP_TO_GROUND || dc.is2DGlobe()) { osym.placePoint = dc.computeTerrainPoint(pos.getLatitude(), pos.getLongitude(), 0); } else if (this.altitudeMode == WorldWind.RELATIVE_TO_GROUND) { osym.placePoint = dc.computeTerrainPoint(pos.getLatitude(), pos.getLongitude(), pos.getAltitude()); } else // Default to ABSOLUTE { double height = pos.getElevation() * dc.getVerticalExaggeration(); osym.placePoint = dc.getGlobe().computePointFromPosition(pos.getLatitude(), pos.getLongitude(), height); } if (osym.placePoint == null) return; // Compute the symbol's screen location the distance between the eye point and the place point. osym.screenPoint = dc.getView().project(osym.placePoint); osym.eyeDistance = osym.placePoint.distanceTo3(dc.getView().getEyePoint()); // Compute a terrain point if needed. if (this.isLineEnabled() && this.altitudeMode != WorldWind.CLAMP_TO_GROUND && !dc.is2DGlobe()) osym.terrainPoint = dc.computeTerrainPoint(pos.getLatitude(), pos.getLongitude(), 0); }
dodanych w tym logika (pobrana z PointPlacemark.java i zaktualizowana dla complian ce do AbstractTacticalSymbol.java). Zauważ, że ustawiłem lineEnabled na true, więc domyślnie powinien on narysować linię.
boolean lineEnabled = true; double lineWidth = 1; protected int linePickWidth = 10; Color lineColor = Color.white; /** * Indicates whether a line from the placemark point to the corresponding position on the terrain is drawn. * * @return true if the line is drawn, otherwise false. */ public boolean isLineEnabled() { return lineEnabled; } /** * Specifies whether a line from the placemark point to the corresponding position on the terrain is drawn. * * @param lineEnabled true if the line is drawn, otherwise false. */ public void setLineEnabled(boolean lineEnabled) { this.lineEnabled = lineEnabled; } /** * Determines whether the placemark's optional line should be drawn and whether it intersects the view frustum. * * @param dc the current draw context. * * @return true if the line should be drawn and it intersects the view frustum, otherwise false. */ protected boolean isDrawLine(DrawContext dc, OrderedSymbol opm) { if (!this.isLineEnabled() || dc.is2DGlobe() || this.getAltitudeMode() == WorldWind.CLAMP_TO_GROUND || opm.terrainPoint == null) return false; if (dc.isPickingMode()) return dc.getPickFrustums().intersectsAny(opm.placePoint, opm.terrainPoint); else return dc.getView().getFrustumInModelCoordinates().intersectsSegment(opm.placePoint, opm.terrainPoint); } /** * Draws the placemark's line. * * @param dc the current draw context. * @param pickCandidates the pick support object to use when adding this as a pick candidate. */ protected void drawLine(DrawContext dc, PickSupport pickCandidates, OrderedSymbol opm) { GL2 gl = dc.getGL().getGL2(); // GL initialization checks for GL2 compatibility. if ((!dc.isDeepPickingEnabled())) gl.glEnable(GL.GL_DEPTH_TEST); gl.glDepthFunc(GL.GL_LEQUAL); gl.glDepthMask(true); try { dc.getView().pushReferenceCenter(dc, opm.placePoint); // draw relative to the place point this.setLineWidth(dc); this.setLineColor(dc, pickCandidates); gl.glBegin(GL2.GL_LINE_STRIP); gl.glVertex3d(Vec4.ZERO.x, Vec4.ZERO.y, Vec4.ZERO.z); gl.glVertex3d(opm.terrainPoint.x - opm.placePoint.x, opm.terrainPoint.y - opm.placePoint.y, opm.terrainPoint.z - opm.placePoint.z); gl.glEnd(); } finally { dc.getView().popReferenceCenter(dc); } } /** * Sets the width of the placemark's line during rendering. * * @param dc the current draw context. */ protected void setLineWidth(DrawContext dc) { Double lineWidth = this.lineWidth; if (lineWidth != null) { GL gl = dc.getGL(); if (dc.isPickingMode()) { gl.glLineWidth(lineWidth.floatValue() + linePickWidth); } else gl.glLineWidth(lineWidth.floatValue()); if (!dc.isPickingMode()) { gl.glHint(GL.GL_LINE_SMOOTH_HINT, GL.GL_FASTEST); gl.glEnable(GL.GL_LINE_SMOOTH); } } } /** * Sets the color of the placemark's line during rendering. * * @param dc the current draw context. * @param pickCandidates the pick support object to use when adding this as a pick candidate. */ protected void setLineColor(DrawContext dc, PickSupport pickCandidates) { GL2 gl = dc.getGL().getGL2(); // GL initialization checks for GL2 compatibility. if (!dc.isPickingMode()) { Color color = this.lineColor; gl.glColor4ub((byte) color.getRed(), (byte) color.getGreen(), (byte) color.getBlue(), (byte) color.getAlpha()); } else { Color pickColor = dc.getUniquePickColor(); Object delegateOwner = this.getDelegateOwner(); pickCandidates.addPickableObject(pickColor.getRGB(), delegateOwner != null ? delegateOwner : this, this.getPosition()); gl.glColor3ub((byte) pickColor.getRed(), (byte) pickColor.getGreen(), (byte) pickColor.getBlue()); } }
Dodany to wezwanie do początku metody drawOrderedRenderable:
boolean drawLine = this.isDrawLine(dc, osym); if (drawLine) this.drawLine(dc, pickCandidates, osym);
Wierzę, że ta ściśle odzwierciedla co PointPlacemark robi, aby uzyskać linię do stawienia teren, ale to, co mam kiedy uruchomić przykład TacticalSymbols z moimi zmianami:
Oto cały plik AbsractTacticalSymbol z moich (prób) zmian: http://pastebin.com/aAC7zn0p (jej zbyt duże dla SO)
Dziękujemy za spojrzenie. Właśnie tego szukałem (zrzut ekranu) - wraz z możliwością kontrolowania szerokości i koloru linii. Jeśli nie masz nic przeciwko, wyjaśnisz zmiany, które trzeba wprowadzić? – systemoutprintln
Zaktualizowałem swoją odpowiedź z wyjaśnieniem. – TWT
To wyjaśnienie pomaga niezmiernie. Jeszcze raz dziękuję. – systemoutprintln