-1

我正在为 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);,但这似乎不起作用。

4

1 回答 1

0

很难准确地说出您要在这里做什么,但有一些事情会作为潜在问题突出。

首先,您的最后两次轮换似乎实际上并不适用于任何事情。如果这些应该代表世界或相机的运动(几乎等同于同一件事),那么它们需要在绘制任何东西之前发生。

那么您的轮换本身可能不会完全按照您的意图进行。

您的立方体围绕 Z 轴旋转。GL 中通常的约定是让相机向下看 Z 轴,而 Y 轴被认为是“向上”。您可以根据自己的喜好自然地解释轴,但围绕“Z”的旋转通常不是“轴承”,而是“滚动”。“轴承”对我来说类似于“偏航”。

当您沿 Z 轴平移时,我假设您正在尝试通过旋转和平移来定位对象,但显然如果旋转与您平移时围绕同一轴,它实际上不会改变立方体的位置 - 它将始终直接在相机前面,绕其轴旋转。

我不太清楚为什么你要像这样定位立方体,而看起来你从一个更具体的位置开始。您可能可以直接构建一个更合适的矩阵。

最后,您的相机/世界旋转是围绕 Y 和 X 的两个串联旋转。您称它们为俯仰和滚动,但通常使用欧拉角进行相机旋转不会产生直观的结果,其中俯仰和滚动等术语完全有意义。通常保持一个方向并对其应用单独的旋转以对其进行更新,而不是尝试更新几个相关的旋转。

所以是的,我希望这段代码在没有其他矩阵运算的情况下,可能会导致直接绘制一个或多个立方体,这些立方体只是围绕视图方向旋转了某个角度。

于 2013-03-14T20:22:19.873 回答