- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
Worldwind 的 Point PlaceMark 可渲染具有通过调用 setLineEnabled 从地标向下到地形放置一条线的功能。如此屏幕截图所示:
我想要做的是添加这样的一行,它也适用于可渲染的战术符号。我的第一个想法是从 PointPlacemark 借用逻辑来做到这一点。可渲染并将其添加到 AbstractTacticalSymbol可渲染。我已经尝试过了,到目前为止我一直没有成功。
这是我到目前为止所做的:
public Vec4 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);
}
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());
}
}
boolean drawLine = this.isDrawLine(dc, osym);
if (drawLine)
this.drawLine(dc, pickCandidates, osym);
最佳答案
好的,所以这里的问题是框架内正投影和透视投影的混合。至关重要的是,如果我们查看 PointPlaceMark 的 beginDrawing
我们看:
GL2 gl = dc.getGL().getGL2(); // GL initialization checks for GL2 compatibility.
int attrMask =
GL2.GL_DEPTH_BUFFER_BIT // for depth test, depth mask and depth func
... bunch more bits being set ...
gl.glPushAttrib(attrMask);
if (!dc.isPickingMode())
{
gl.glEnable(GL.GL_BLEND);
OGLUtil.applyBlending(gl, false);
}
beginDrawing
我们看到了更多的代码,特别是这两行:
this.BEogsh.pushProjectionIdentity(gl);
gl.glOrtho(0d, viewport.getWidth(), 0d, viewport.getHeight(), 0d, -1d);
doDrawOrderedRenderable
中这样做了调用后
drawLine
(第 976 行)。
render()
中的透视投影开始的。方法,解决这个问题就像在我们画线后延迟正投影开始一样简单,就像在 PointPlaceMark 的代码中一样。
beginDrawing
之前,你快完成了。
SymbolWithLine
父类(super class)或接口(interface),或使用组合来添加功能。或者,如果您不需要在许多其他类中使用此功能,您可以保持这种状态。无论如何,我希望这是足够的信息来解决这个问题。
this.lineColor = Color.CYAN;
this.lineWidth = 3;
this.drawLine(dc, this.pickSupport, osym);
关于java - 从符号到地形的 Worldwind 线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37900553/
我在 WorldWindowGLJPanel 的图层列表中添加了两个图层。其中一个是包含形状的 RenderableLayer,另一个是包含光栅图像的 BasicTiledImageLayer。 (一
有没有办法将图像放入 WorldWind 中的海拔高度?我可以使用Surface Image将图像放置在地球上 - 但我希望将其放置在地形上方的给定高度处,但我在 API 中没有找到它。 最佳答案 您
我在 WorldWind 的 Sphere 中看到了看似矛盾的行为-线相交逻辑。我创建了一个 Sphere 和 Line,它们相交但随后交集返回 null(扫描代码以获取评论://*** 这就是它变得
在 NASA WorldWind Java 中,我使用 PointPlacemark 来表示图像,因为无论缩放级别如何,它都保持相同的大小。问题是我想在 Point Placemark 上设置航向,即
我正在经历这个tutorial 每当我的鼠标悬停在用这个 code 创建的立方体上时(下面是我的版本),大气层和星星消失了。 正常情况下是这样的: 这是我将鼠标悬停在立方体上时的样子(看看大气层):
我想将 WorldWindowGLJPanel 放入 Pane 中,并且希望使其可调整大小,但我不能,即使我调用 resize 或 setSize 方法。 这是我正在做的事情: wwd = new W
我想创建一个应用程序,允许用户输入经度和纬度,然后将其显示在 map 上。我遇到过WorldWind但我以前从未听说过。 要创建这样的应用程序,我最好使用 WorldWind 或 OpenStreet
我想在地球上画一 strip 有高程表示的线,如下所示: 我知道我可以用折线来表示一条线,但是如何填充线下方的空间? 最佳答案 您可以使用路径来画线。 setOutlineMaterial 将绘制一个
我正在尝试在 NASA Worldwind for Java 中实现我自己的杂波过滤器,它导致了一个奇怪的问题 - 杂波过滤器还没有做太多事情,但当我通过时,我将使用它来移动东西。 “闪烁”问题。每当
当我点击地球时,我在获取位置(纬度/经度)时遇到了问题。 SO(和其他网站)上的任何地方都建议使用 getCurrentPosition 方法。 不幸的是,这会返回包含单击点的顶部可拾取对象的位置,因
Worldwind 的 Point PlaceMark 可渲染具有通过调用 setLineEnabled 从地标向下到地形放置一条线的功能。如此屏幕截图所示: 我想要做的是添加这样的一行,它也适用于可
我正在尝试找出一种方法,以编程方式获取用户在 WorldWind AnalyticSurface 上单击的点的视觉颜色(而不是拾取颜色)。 查看AnalyticSurface和 PickedObjec
我知道在 WorldWind Java 中,您可以通过以下方式找到海拔高度和特定位置: public Double getPositionElevationMeters(Double lat, Dou
本文整理了Java中gov.nasa.worldwind.util.WWMath类的一些代码示例,展示了WWMath类的具体用法。这些代码示例主要来源于Github/Stackoverflow/Mav
我正在从事与 nasa worldwind 相关的项目。 任何人都可以向我解释一下,我可以删除世界地图吗? 位于屏幕左上方。 最佳答案 如果您使用的是自定义 layers.xml 文件,您可以注释掉以
所以,我意识到这可能不是正确的网站,但我认为在 WorldWind 论坛上提问是不礼貌的。如果应该在其他地方,请告诉我。 无论如何... 我有一个 Java 应用程序,当前使用 WorldWind 来
我是 Web WorldWind 的新手,如果这是一个简单的问题,请原谅我,但我还没有在文档或其他地方找到解决方案。我有以下内容: Your browser does n
大家好!我在 WorldWind 库(它是 NASA 库)方面遇到了一些问题。我在 JetBrains Idea 14 中使用 Java 8 编写应用程序。在 Idea 中,我可以成功编译并运行我的应
我正在使用 WorldWind 并尝试在同一层中“挑选”多个表面图像,但不明白为什么它不起作用。 我的印象是这样称呼: this.getWwd().getSceneController().setDe
我有一个 WorldWindow,上面有各种 RenderableLayer。我想在运行时添加一个 CompassLayer。 try { String compassPath = "imag
我是一名优秀的程序员,十分优秀!