I am trying to use gluUnProject to convert window coords to world coords. I am not trying to get a working sample in an emulator or older Android systems (with OpenGL ES v1.0), and this is not a question of the availability of GL functions. I am trying to work with a real device using OpenGL ES 1.1, and glGet functions return non-zero results.
There is a sample:
public Vector3 translateScreenCoordsToWorld(Vector2 screenCoords) {
gl.glLoadIdentity();
final Matrix4x4 modelViewMatrix = new Matrix4x4();
final Matrix4x4 projectMatrix = new Matrix4x4();
int[] viewVectorParams = new int[4];
gl.glGetIntegerv(GL11.GL_VIEWPORT,viewVectorParams,0);
gl.glGetFloatv(GL11.GL_MODELVIEW_MATRIX,modelViewMatrix.buffer,0);
gl.glGetFloatv(GL11.GL_PROJECTION_MATRIX,projectMatrix.buffer,0);
float[] output = new float[4];
GLU.gluUnProject(
screenCoords.x, screenCoords.y, 0,
modelViewMatrix.buffer, 0,
projectMatrix.buffer, 0,
viewVectorParams, 0,
output, 0);
return new Vector3(output[0],output[1],output[2]);
}
Matrix4x4 is just a wrapper for the float [] buffer;
Using this function, I try to create a plane to fill the entire screen or determine the maximum world coordinates for the current forecast matrix, but it does not work at all, because I'm not sure that I use these functions correctly.
, translateScreenCoordsToWorld ( Vector2 (480,800)), Vector3 (0.27f, 0.42f, -1.0f).
- gluUnProject GL_PROJECTION .
. :(
:
public Vector3 translateScreenCoordsToWorld(Vector2 screenCoords) {
float winX = screenCoords.x, winY = screenCoords.y, winZ = 0;
winY = (float)currentViewVectorParams[3] - winY;
float[] output = new float[4];
GLU.gluUnProject(
winX, winY, winZ,
currentModelViewMatrix.buffer, 0,
currentProjectMatrix.buffer, 0,
currentViewVectorParams, 0,
output, 0
);
Vector3 nearPlane = new Vector3(output[0],output[1],output[2]);
winZ = 1.0f;
GLU.gluUnProject(
winX, winY, winZ,
currentModelViewMatrix.buffer, 0,
currentProjectMatrix.buffer, 0,
currentViewVectorParams, 0,
output, 0
);
Vector3 farPlane = new Vector3(output[0],output[1],output[2]);
farPlane.sub(nearPlane);
farPlane.div( nearPlane.length());
float dot1, dot2;
Vector3 pointInPlane = new Vector3(), pointPlaneNormal = new Vector3(0,0,-1);
pointInPlane.sub( nearPlane );
dot1 = (pointPlaneNormal.x * pointInPlane.x) + (pointPlaneNormal.y * pointInPlane.y) + (pointPlaneNormal.z * pointInPlane.z);
dot2 = (pointPlaneNormal.x * farPlane.x) + (pointPlaneNormal.y * farPlane.y ) +(pointPlaneNormal.z * farPlane.z);
float t = dot1/dot2;
farPlane.mul(t);
return farPlane.add(nearPlane);
}
:
public void updateCamera() {
Camera camera = scene.getCamera();
GLU.gluLookAt(gl,
camera.position.x, camera.position.y, camera.position.z,
camera.target.x, camera.target.y, camera.target.z,
camera.upAxis.x, camera.upAxis.y, camera.upAxis.z
);
gl.glGetIntegerv(GL11.GL_VIEWPORT,currentViewVectorParams,0);
gl.glGetFloatv(GL11.GL_MODELVIEW_MATRIX, currentModelViewMatrix.buffer,0);
gl.glGetFloatv(GL11.GL_PROJECTION_MATRIX,currentProjectMatrix.buffer,0);
}
:
camera.position = { 0, 0, 65 };
camera.target = { 0, 0, 0 }
camera.upAxis = { 0, 1, 0 }