我需要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太靠近近切面时会失败,因此当将Near设为0并将far设为-10时,我将winz设置为-5。这对输出没有影响。

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

最佳答案

我猜您正在使用仿真器?它的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]除;-)

关于android - gluUnProject始终返回零,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7262109/

10-08 22:56