我需要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(不是数字),这可能是问题或算法中更高的东西
答案 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]
; - )