我正在为 android 开发一个增强现实应用程序,并尝试使用 openGl 将立方体放置在世界各地。我当前的方法可以在下面的代码中看到:
for(Marker ma: ARData.getMarkerlist().values()) {
Log.d("populating", "");
gl.glPushMatrix();
Location maLoc = new Location("loc");
maLoc.setLatitude(ma.lat);
maLoc.setLongitude(ma.lng);
maLoc.setAltitude(ma.alt);
float distance = currentLoc.distanceTo(maLoc);
float bearing = currentLoc.bearingTo(maLoc);
Log.d("distance", String.valueOf(distance));
Log.d("bearing", String.valueOf(bearing));
gl.glRotatef(bearing,0,0,1);
gl.glTranslatef(0,0,-distance);
ma.cube.draw(gl);
gl.glPopMatrix();
}
gl.glRotatef(y, 0, 1, 0);
gl.glRotatef(x, 1, 0, 0);`
其中 y 是偏航角,x 是俯仰角。目前,我在屏幕上以 45 度角在远处某个地方看到了一个立方体。看起来我得到了合理的方位和距离值。这可能与手机方向有关吗?如果您需要更多代码,请告诉我。
编辑:我将轴承旋转更新为gl.glRotatef(bearing,0,1,0);
我现在正在将我的立方体沿屏幕水平映射到不同深度。使用航向和俯仰仍然没有移动,但@Mirkules 已经确定了一些可能的原因。
编辑 2:我现在尝试通过将矩阵旋转到标记的航向和方位之间的角度差来放置立方体。然而,我得到的只是一种抖动,立方体似乎被渲染在一个新位置,然后又跳回到旧位置。代码同上,但以下内容除外:
float angleDiff = bearing - y;
gl.glRotatef((angleDiff),0,1,0);
gl.glTranslatef(0,0,-distance);
轴承和y都归一化为 0 - 360 范围。此外,我将“相机旋转”移动到设置标记的代码上方。
编辑 3:我现在正在使用float angleDiff = (bearing + y)/2;
. 但是,我似乎无法让音高工作。我曾尝试使用gl.glRotatef(-x,1,0,0);
,但这似乎不起作用。