Buduję aplikację dla systemu Android, która korzysta z OpenGL ES 2.0, a ja natknąłem się na ścianę. Próbuję przekształcić współrzędne ekranu (gdzie użytkownik dotyka) na współrzędne globalne. Próbowałem czytać i bawić się z GLU.gluUnProject, ale robię to źle lub po prostu nie rozumiem tego.Współrzędne ekranu Android OpenGL ES 2.0 do współrzędnych światowych
To moja próba ....
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];
}
Numery Dostaję nie wydaje się słuszne, jest to dobry sposób, żeby wykorzystać tę metodę? Czy działa w OpenGL ES 2.0? Czy przed obliczeniami należy wykonać macierz modelu macierzy tożsamości (Matrix.setIdentityM (mModelMatix, 0))?
Jako kontynuację, jeśli to prawda, w jaki sposób wybrać wyjście Z? Zasadniczo zawsze wiem, w jakiej odległości chcę współrzędne świata, ale parametr Z w GLU.gluUnProject wydaje się być rodzajem interpolacji między bliską a daleką płaszczyzną. Czy to tylko liniowa interpolacja?
góry dzięki
Moi rozwiązania są w C++. Po zeskanowaniu tej odpowiedzi wygląda mi to dobrze. Tak więc nie będę publikować odpowiedzi. :] – TheBuzzSaw