android - gluUnProject 总是返回零

标签 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,但是 getDoublev 似乎不受 GL11 的支持

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

还有

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

double 和 float 是否重要?如果是,我该如何使用 double

谢谢

编辑:

有人告诉我 gluUnproject 在离 near far 裁剪平面太近时会失败,所以当 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() 函数需要计算组合模型 View 投影矩阵的逆矩阵,由于这些都是零,因此逆矩阵不存在并将由 NaN 组成。因此,生成的 newcoords 向量也是所有 Nans。

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

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

相关文章:

opengl - 这个简单的FxAA如何工作?

csv - 将 CSV 文件导入 Google map

c# - 将纬度经度坐标转换为图像 map 坐标

android - 单击最后一项时滚动到 ExpandableListView 的末尾

android - 为什么 ListView.getChildAt() 在 android 中返回 null

android - 如何允许用户从android中的日期选择器中仅选择从今天起10年之前的日期?

android - 我应该如何组织我的 Android uiautomator 测试用例?

ios - Metal 着色器中的 GLSL gl_FragDepth 等效项

android - 在 Java 上创建位图并使用 JNI 将其发送到 C++ 并通过 OpenGL 渲染它,黑色

c++ - 在递归迷宫求解器中保存路径坐标?