【问题标题】:Rotation in OpenGl ES to place objects then rotate the world在 OpenGL ES 中旋转以放置对象然后旋转世界
【发布时间】:2013-03-14 18:40:20
【问题描述】:

我正在为 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);

bearingy 都归一化为 0 - 360 度。此外,我将“相机旋转”移动到设置标记的代码上方。

编辑 3: 我的航向正在使用,float angleDiff = (bearing + y)/2;。但是,我似乎无法让音高工作。我曾尝试使用gl.glRotatef(-x,1,0,0);,但这似乎不起作用。

【问题讨论】:

    标签: java android opengl-es augmented-reality


    【解决方案1】:

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

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

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

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

    当您沿 Z 轴平移时,我假设您正试图通过旋转和平移来定位对象,但显然如果旋转围绕您平移的同一轴,它实际上不会改变立方体 - 它总是在摄像机的正前方,绕着它的轴旋转。

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

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

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

    【讨论】:

    • 感谢您的回复,我将尝试使用您的一些观察来修复我的代码并报告回来。我使用方位和距离的原因是因为我想不出更好的方法将纬度/经度转换为 openGl 使用的 (x,y,z) 坐标系。
    • 另外,值得注意的是我正在前进。我使用加速度计、磁力计和陀螺仪创建的融合传感器偏航和滚动。我可以从这个融合的传感器获得旋转矩阵,但我也无法从中获得结果。
    猜你喜欢
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    相关资源
    最近更新 更多