PointPlacemarks 的绘制顺序
Draw order of PointPlacemarks
有没有办法固定点地标在世界风中的绘制顺序?
即使在 Placemarks example 中,地标 B 和音频地标的顺序也可以通过在特定缩放级别移动鼠标来更改:
到目前为止我已经尝试过:
- 将点地标添加到单独的图层
- 使用
RenderableLayer.setRenderables
而不是 RenderableLayer.addRenderable
- Related question on World Wind forums
Hacky解决方案(需要修改World Wind源码)
在 gov.nasa.worldwind.render.DrawContextImpl
中从
更改为 orderedRenderables
protected PriorityQueue<OrderedRenderableEntry> orderedRenderables =
new PriorityQueue<OrderedRenderableEntry>(100, new Comparator<OrderedRenderableEntry>()
{
public int compare(OrderedRenderableEntry orA, OrderedRenderableEntry orB)
{
double eA = orA.distanceFromEye;
double eB = orB.distanceFromEye;
return eA > eB ? -1 : eA == eB ? (orA.time < orB.time ? -1 : orA.time == orB.time ? 0 : 1) : 1;
}
});
到
protected Queue<OrderedRenderableEntry> orderedRenderables = new ArrayDeque<>();
(或修改比较器以执行您想要的操作)。这将修复绘图顺序。
替代方案(不需要修改World Wind源码)
扩展 PointPlacemark
并覆盖 makeOrderedRenderable()
:
public class OrderedPointPlacemark extends PointPlacemark {
public OrderedPointPlacemark(Position position) {
super(position);
}
@Override
protected void makeOrderedRenderable(DrawContext dc) {
super.makeOrderedRenderable(dc);
if (this.intersectsFrustum(dc) || this.isDrawLine(dc)) {
dc.pollOrderedRenderables();
dc.addOrderedSurfaceRenderable(this);
}
}
}
有没有办法固定点地标在世界风中的绘制顺序?
即使在 Placemarks example 中,地标 B 和音频地标的顺序也可以通过在特定缩放级别移动鼠标来更改:
到目前为止我已经尝试过:
- 将点地标添加到单独的图层
- 使用
RenderableLayer.setRenderables
而不是RenderableLayer.addRenderable
- Related question on World Wind forums
Hacky解决方案(需要修改World Wind源码)
在 gov.nasa.worldwind.render.DrawContextImpl
中从
orderedRenderables
protected PriorityQueue<OrderedRenderableEntry> orderedRenderables =
new PriorityQueue<OrderedRenderableEntry>(100, new Comparator<OrderedRenderableEntry>()
{
public int compare(OrderedRenderableEntry orA, OrderedRenderableEntry orB)
{
double eA = orA.distanceFromEye;
double eB = orB.distanceFromEye;
return eA > eB ? -1 : eA == eB ? (orA.time < orB.time ? -1 : orA.time == orB.time ? 0 : 1) : 1;
}
});
到
protected Queue<OrderedRenderableEntry> orderedRenderables = new ArrayDeque<>();
(或修改比较器以执行您想要的操作)。这将修复绘图顺序。
替代方案(不需要修改World Wind源码)
扩展 PointPlacemark
并覆盖 makeOrderedRenderable()
:
public class OrderedPointPlacemark extends PointPlacemark {
public OrderedPointPlacemark(Position position) {
super(position);
}
@Override
protected void makeOrderedRenderable(DrawContext dc) {
super.makeOrderedRenderable(dc);
if (this.intersectsFrustum(dc) || this.isDrawLine(dc)) {
dc.pollOrderedRenderables();
dc.addOrderedSurfaceRenderable(this);
}
}
}