In NASA WorldWind Java, I use PointPlacemark to represent the image because it stays the same size regardless of the zoom level. The problem is that I want to set the title on the Point Placemark method and leave it on this compass, even when the camera is tilted. It works exactly the way I want when I look at an infinite globe, but when I bend, the label continues to collide with the screen instead of tilting with the globe, which makes it act weirdly.
Here is a GIF illustrating what I see: https://giphy.com/embed/3o7WIqZUceR8xh6BOg
I would like the Point Placemark Image to remain on the title bar relative to the globe, even when it is tilted - so that the image is essentially “flattened” when the image is tilted, but it remains the same size regardless of the zoom level.
Here is a piece of code that I am using. I set attrs.setHeadingReference (AVKey.RELATIVE_TO_GLOBE); on the related attributes of PointPlacemarkAttributes. In this example, I set the title to 135 degrees.
import gov.nasa.worldwind.WorldWind; import gov.nasa.worldwind.avlist.AVKey; import gov.nasa.worldwind.geom.Position; import gov.nasa.worldwind.layers.RenderableLayer; import gov.nasa.worldwind.render.Offset; import gov.nasa.worldwind.render.PointPlacemark; import gov.nasa.worldwind.render.PointPlacemarkAttributes; public class Placemarks extends ApplicationTemplate { public static class AppFrame extends ApplicationTemplate.AppFrame { public AppFrame() { super(true, true, false); final RenderableLayer layer = new RenderableLayer(); PointPlacemark pp = new PointPlacemark(Position.fromDegrees(28, -102, 30000)); pp.setLabelText("Airplane"); pp.setLineEnabled(false); pp.setAltitudeMode(WorldWind.ABSOLUTE); PointPlacemarkAttributes attrs = new PointPlacemarkAttributes(); attrs.setImageAddress("images/airplane.png"); attrs.setScale(0.05); attrs.setImageOffset(Offset.CENTER);
I also played using Polygon with a texture applied to it. The way it is oriented is what I am looking for - except that I want the icon to remain the same size regardless of the zoom level (for example, what PointPlacemark does).
Here is a GIF illustrating what I see when using Polygon. Pay attention to how it acts when the globe is tilted: https://giphy.com/embed/xThta4USlDzd8Ii5ZS
Here is the source I'm using for Polygon:
import java.awt.geom.AffineTransform; import java.util.Arrays; import java.util.List; import gov.nasa.worldwind.WorldWind; import gov.nasa.worldwind.geom.Position; import gov.nasa.worldwind.layers.RenderableLayer; import gov.nasa.worldwind.render.BasicShapeAttributes; import gov.nasa.worldwind.render.Polygon; public class TexturedPolygon extends ApplicationTemplate { public static Polygon createPolygonTexturedImage(String filePath, Position pos, double heading, double scale) { double offsetDist = 1.0D * scale; Position p1 = Position.fromDegrees(pos.getLatitude().addDegrees(-offsetDist).getDegrees(), pos.getLongitude().addDegrees(-offsetDist).getDegrees(), pos.getAltitude()); Position p2 = Position.fromDegrees(pos.getLatitude().addDegrees(offsetDist).getDegrees(), pos.getLongitude().addDegrees(-offsetDist).getDegrees()); Position p3 = Position.fromDegrees(pos.getLatitude().addDegrees(offsetDist).getDegrees(), pos.getLongitude().addDegrees(offsetDist).getDegrees()); Position p4 = Position.fromDegrees(pos.getLatitude().addDegrees(-offsetDist).getDegrees(), pos.getLongitude().addDegrees(offsetDist).getDegrees()); double[] points = new double[] { p1.getLatitude().getDegrees(), p1.getLongitude().getDegrees(), p2.getLatitude().getDegrees(), p2.getLongitude().getDegrees(), p3.getLatitude().getDegrees(), p3.getLongitude().getDegrees(), p4.getLatitude().getDegrees(), p4.getLongitude().getDegrees() }; double[] transformedPoints = new double[8]; AffineTransform rotation = new AffineTransform(); rotation.rotate(Math.toRadians(heading), pos.getLatitude().getDegrees(), pos.getLongitude().getDegrees()); rotation.transform(points, 0, transformedPoints, 0, 4); double altitude = pos.getAltitude(); p1 = Position.fromDegrees(transformedPoints[0], transformedPoints[1], altitude); p2 = Position.fromDegrees(transformedPoints[2], transformedPoints[3], altitude); p3 = Position.fromDegrees(transformedPoints[4], transformedPoints[5], altitude); p4 = Position.fromDegrees(transformedPoints[6], transformedPoints[7], altitude); List<Position> positions = Arrays.asList(p1, p2, p3, p4); Polygon polygon = new Polygon(positions); polygon.setAltitudeMode(WorldWind.ABSOLUTE); BasicShapeAttributes mattr = new BasicShapeAttributes(); mattr.setDrawOutline(false); mattr.setDrawInterior(true); polygon.setAttributes(mattr); polygon.setTextureImageSource(filePath, new float[] { 0.0F, 0.0F, 1.0F, 0.0F, 1.0F, 1.0F, 0.0F, 1.0F }, 4); return polygon; } public static class AppFrame extends ApplicationTemplate.AppFrame { public AppFrame() { super(true, true, false); final RenderableLayer layer = new RenderableLayer(); Position pos = Position.fromDegrees(28, -102, 30000); String url = "images/airplane.png"; layer.addRenderable(createPolygonTexturedImage(url, pos, 135.0, 1.05));
For completeness - this is the image that I use as my plane. png:

So, to summarize what I'm looking for:
- A Renderable represented by Icon
- The icon remains the same regardless of the zoom level.
- The icon remains oriented to the heading of the compass of the globe, even if the camera view is tilted.