我正在为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);
,但这似乎不起作用。
答案 0 :(得分:0)
准确地告诉你在这里要做什么是很棘手的,但是有一些事情会成为潜在的问题。
首先,你的最后两次轮换似乎并不适用于任何事情。如果它们应该代表世界或相机的运动(这大部分都是相同的东西)那么它们需要在绘制任何东西之前发生。
然后你的轮换也许并不完全符合你的意图。
您的立方体围绕Z轴旋转。 GL中通常的惯例是摄像机向下看Z轴,Y轴被认为是“向上”。您可以自然地解释您喜欢的轴,但围绕“Z”的旋转通常不会“承载”,而是“滚动”。对我的“承受”类似于“偏航”。
当您沿着Z轴平移时,我假设您正在尝试通过旋转和平移来定位对象,但显然如果旋转与您平移的旋转轴相同,则实际上不会改变位置。立方体 - 它总是直接在相机前面,在其轴上旋转。
我不清楚你为什么要尝试定位这个多维数据集,就好像你从一个更具体的位置开始。你可以直接构建一个更合适的矩阵。
最后,你的相机/世界旋转是围绕Y和X的两个连续旋转。你称这些俯仰和滚动,但通常使用欧拉角度进行相机旋转不会产生直观的结果,如音高和滚动等术语完成感。保持方向并对其进行单独旋转以更新它是常见的,而不是尝试更新多个从属旋转。
所以是的,我希望在没有其他矩阵运算的情况下,这段代码可能会导致直接绘制一个或多个立方体,这些立方体只是围绕视图方向旋转一定角度。