我正在构建一个使用 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 参数似乎是近平面和远平面之间的某种插值。它只是线性插值吗?
提前致谢