【发布时间】:2018-09-13 05:43:32
【问题描述】:
我试图弄清楚为什么 PointPlacemarkAttributes 中的 setPitch 似乎无法正常工作。
我相信PointPlacemark.java 中的这个 JOGL 代码是出了问题的地方:
Double heading = getActiveAttributes().getHeading();
Double pitch = getActiveAttributes().getPitch();
// Adjust heading to be relative to globe or screen
if (heading != null)
{
if (AVKey.RELATIVE_TO_GLOBE.equals(this.getActiveAttributes().getHeadingReference()))
heading = dc.getView().getHeading().degrees - heading;
else
heading = -heading;
}
// Apply the heading and pitch if specified.
if (heading != null || pitch != null)
{
gl.glTranslated(xscale / 2, yscale / 2, 0);
if (pitch != null)
gl.glRotated(pitch, 1, 0, 0);
if (heading != null)
gl.glRotated(heading, 0, 0, 1);
gl.glTranslated(-xscale / 2, -yscale / 2, 0);
}
// Scale the unit quad
gl.glScaled(xscale, yscale, 1);
这是我一直在使用的一个简单驱动程序:
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("PointPlacemark");
pp.setLineEnabled(false);
pp.setAltitudeMode(WorldWind.ABSOLUTE);
PointPlacemarkAttributes attrs = new PointPlacemarkAttributes();
attrs.setImageAddress("gov/nasa/worldwindx/examples/images/georss.png");
attrs.setScale(1.0);
attrs.setImageOffset(Offset.CENTER);
attrs.setPitch(45.0);
pp.setAttributes(attrs);
layer.addRenderable(pp);
// Add the layer to the model.
insertBeforeCompass(getWwd(), layer);
}
}
public static void main(String[] args) {
ApplicationTemplate.start("WorldWind Placemarks", AppFrame.class);
}
}
如果我不设置音高,它看起来很好:
但是当我设置 45 度的俯仰角时,它看起来像这样:
我不明白它与我设置的值有何关联。我希望它能够像 Compass 在CompassLayer 中那样工作:
更新
评论建议遍历音高值以查看其工作原理。我这样做了,但我仍然没有看到它应该如何工作。看起来它只是水平“裁剪”图像,而不做任何其他事情。这是一些代码:
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("PointPlacemark");
pp.setLineEnabled(false);
pp.setAltitudeMode(WorldWind.ABSOLUTE);
PointPlacemarkAttributes attrs = new PointPlacemarkAttributes();
attrs.setImageAddress("gov/nasa/worldwindx/examples/images/georss.png");
attrs.setScale(1.0);
attrs.setImageOffset(Offset.CENTER);
pp.setAttributes(attrs);
layer.addRenderable(pp);
// Add the layer to the model.
insertBeforeCompass(getWwd(), layer);
Thread t = new Thread(new Runnable() {
@Override
public void run() {
for(double i = 0.0; i<360; i+=.1) {
attrs.setPitch(i);
System.out.println("Pitch is now "+i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
AppFrame.this.getWwd().redrawNow();
}
}
});
t.start();
}
}
public static void main(String[] args) {
ApplicationTemplate.start("WorldWind Placemarks", AppFrame.class);
}
}
还有一个屏幕录制的 GIF:
【问题讨论】:
-
似乎 pitch 是围绕 X 轴在“平行”方向上的旋转(Y 轴作为“子午线”)。 heading 围绕 Z 轴旋转,垂直于切平面。设置不同的、小步增加的俯仰和航向值,看看它们是如何工作的。
-
好主意——我在上面的问题中添加了一些代码来做到这一点。标题按我的预期工作,我可以看到它围绕 Z 轴旋转。不过,音高似乎并没有绕 Y 轴旋转。对我来说,它看起来就像是在裁剪图像。
-
顺便说一句,我注意到您指向代码的 repo 是一个旧的已弃用的;查看未解决的问题以了解我的意思。 github.com/NASAWorldWind/WorldWindJava 似乎是活跃的,确实有一个关于这个问题的错误报告,甚至可能是由@systemoutprintln...
-
啊。好的 - 我修复了链接。是的,就是我 :-)。
标签: java geometry jogl worldwind