我正在构建一个使用OpenGL ES 2.0的Android应用程序,但我遇到了麻烦。我试图将屏幕坐标(用户触摸位置)转换为世界坐标。我尝试过阅读和使用GLU.gluUnProject进行实验,但我要么做错了,要么就是不理解它。
这是我的尝试....
public void getWorldFromScreen(float x, float y) {
int viewport[] = { 0, 0, width , height};
float startY = ((float) (height) - y);
float[] near = { 0.0f, 0.0f, 0.0f, 0.0f };
float[] far = { 0.0f, 0.0f, 0.0f, 0.0f };
float[] mv = new float[16];
Matrix.multiplyMM(mv, 0, mViewMatrix, 0, mModelMatrix, 0);
GLU.gluUnProject(x, startY, 0, mv, 0, mProjectionMatrix, 0, viewport, 0, near, 0);
GLU.gluUnProject(x, startY, 1, mv, 0, mProjectionMatrix, 0, viewport, 0, far, 0);
float nearX = near[0] / near[3];
float nearY = near[1] / near[3];
float nearZ = near[2] / near[3];
float farX = far[0] / far[3];
float farY = far[1] / far[3];
float farZ = far[2] / far[3];
}
我得到的数字似乎不对,这是使用该方法的正确方式吗?它适用于OpenGL ES 2.0吗?在进行这些计算之前,我应该将模型矩阵设置为单位矩阵(Matrix.setIdentityM(mModelMatix, 0))吗?
作为跟进,如果这是正确的方法,如何选择输出Z值?基本上,我总是知道世界坐标应该处于什么距离,但GLU.gluUnProject中的Z参数似乎是接近面和远截面之间的某种插值。这只是线性插值吗?
提前感谢。