gluUnProject总是返回零

时间:2011-08-31 19:08:15

标签: android opengl-es coordinates

我需要gluUnProject将屏幕坐标转换为世界坐标,现在我只是让它工作。当我的应用程序运行时,它会准确地告诉我屏幕上的坐标,我知道这些坐标存储在我的渲染器线程中,然后抽出屏幕坐标。不幸的是,屏幕坐标似乎没有世界坐标的影响,世界坐标保持为零。

这是我的gluUnProject方法

public void vector3 (GL11 gl){

        int[] viewport = new int[4];
        float[] modelview = new float[16];
        float[] projection = new float[16];
        float winx, winy, winz;
        float[] newcoords = new float[4];

        gl.glGetIntegerv(GL11.GL_VIEWPORT, viewport, 0);
        ((GL11) gl).glGetFloatv(GL11.GL_MODELVIEW_MATRIX, modelview, 0);
        ((GL11) gl).glGetFloatv(GL11.GL_PROJECTION_MATRIX, projection, 0);

        winx = (float)setx;
        winy = (float)viewport[3] - sety;
        winz = 0;

        GLU.gluUnProject(setx, (float)viewport[3] - sety, 0, modelview, 0, projection, 0, viewport, 0, newcoords, 0);
        posx = (int)newcoords[0];
        posy = (int)newcoords[1];
        posz = (int)newcoords[2];



        Log.d(TAG, "x= " + String.valueOf(posx));
        Log.d(TAG, "y= " + String.valueOf(posy));
        Log.d(TAG, "z= " + String.valueOf(posz));
        }

现在我已经搜索并找到this forum post,他们得出的结论是使用getFloatv而不是getDoublev,但GL11似乎不支持getDoublev

The method glGetDoublev(int, float[], int) is undefined for the type GL11

以及

The method glGetDoublev(int, double[], int) is undefined for the type GL11

双重和漂浮物是否重要,如果是这样,我该如何使用双打

谢谢

修改

有人告诉我,当离近近剪裁平面时,gluUnproject会失败,所以当win接近0且远离-10时,我将winz设置为-5。这对输出没有影响。

我还记录了newcoords []数组的每一部分,它们都返回了一些NaN(不是数字),这可能是问题或算法中更高的东西

1 个答案:

答案 0 :(得分:1)

我猜你正在模拟器上工作?它的OpenGL实现相当错误,经过测试后我发现它为以下调用返回全零:

gl11.glGetIntegerv(GL11.GL_VIEWPORT, viewport, 0);
gl11.glGetFloatv(GL11.GL_MODELVIEW_MATRIX, modelview, 0);
gl11.glGetFloatv(GL11.GL_PROJECTION_MATRIX, projection, 0);

gluUnProject()函数需要计算组合模型视图 - 投影矩阵的逆,并且因为它们都是零,所以逆不存在并且将由NaN组成。因此得到的newcoords向量也是所有Nans。

在具有适当OpenGL实现的设备上尝试它,它应该工作。请记住,仍然除以newcoords[3]; - )