I haven't ever used gluUnProject() myself but unless your geometry is glued right to the near plane I'm pretty sure it's wrong to pass zero for your window space Z. Unless you have special knowledge of your Z I guess you'll need to read that value from the depth buffer.
On Mon, Nov 7, 2011 at 5:34 PM, saex <elpablos...@gmail.com> wrote: > I have a simple Square with openGL es 1 and Android 1.5. The square is > painted on the center of the screen. > > I want that when the user press on the screen, or moves the finger on > the screen, the square get's moved to that position. For do this i > tryed with GLuUnProject, i tryed to obtain the opengl coordinate that > matches with the window XY coordinate touched with the finger (to > translate the polygon to that coordinate in the future), and i'm > writting the coordinates on the LogCat. > > The coordinate's i'm receiving are not true cordinates, are wrong > coordinates. For example this logcat represents a horizontal movement > to the right of the screen: > > 11-07 15:54:37.221: DEBUG/XXXXXXXXX(213): X: -0.003236022 > 11-07 15:54:37.221: DEBUG/XXXXXXXXX(213): Y: -0.047979668 > 11-07 15:54:37.241: DEBUG/XXXXXXXXX(213): X: -0.003236022 > 11-07 15:54:37.251: DEBUG/XXXXXXXXX(213): Y: -0.047807075 > 11-07 15:54:39.110: DEBUG/XXXXXXXXX(213): X: 0.03469036 > 11-07 15:54:39.110: DEBUG/XXXXXXXXX(213): Y: 0.04418271 > 11-07 15:54:43.021: DEBUG/XXXXXXXXX(213): X: -0.029469538 > 11-07 15:54:43.021: DEBUG/XXXXXXXXX(213): Y: -0.034172554 > 11-07 15:54:43.051: DEBUG/XXXXXXXXX(213): X: -0.026708115 > 11-07 15:54:43.051: DEBUG/XXXXXXXXX(213): Y: -0.034172554 > 11-07 15:54:43.081: DEBUG/XXXXXXXXX(213): X: -0.018596433 > 11-07 15:54:43.081: DEBUG/XXXXXXXXX(213): Y: -0.034172554 > 11-07 15:54:43.111: DEBUG/XXXXXXXXX(213): X: -0.013073588 > 11-07 15:54:43.111: DEBUG/XXXXXXXXX(213): Y: -0.034172554 > 11-07 15:54:43.141: DEBUG/XXXXXXXXX(213): X: -0.0039263717 > 11-07 15:54:43.141: DEBUG/XXXXXXXXX(213): Y: -0.033999965 > 11-07 15:54:43.162: DEBUG/XXXXXXXXX(213): X: -0.0011649576 > 11-07 15:54:43.162: DEBUG/XXXXXXXXX(213): Y: -0.033827372 > 11-07 15:54:43.191: DEBUG/XXXXXXXXX(213): X: 7.335304E-4 > 11-07 15:54:43.191: DEBUG/XXXXXXXXX(213): Y: -0.033654787 > > > > > > This is the source code: > > > > > > public class MySurfaceView extends GLSurfaceView implements > Renderer { > private float INITIAL_Z = -35.0f; > private Context context; > private Square square; > private float xrot; //X Rotation > private float yrot; //Y Rotation > private float zrot; //Z Rotation > private float z = INITIAL_Z; //Profundidad en el > eje Z > private float x = 0.0f; //eje X > private float y = 0.0f; //eje Y > > private MatrixGrabber mg = new MatrixGrabber(); //create the > matrix grabber object in your initialization code > byte horizontal=-1; //0: LEFT 1:CENTER 2:RIGHT > byte vertical=-1; //0: TOP 1:CENTER 2:BOTTOM > float startX=-1; > float startY=-1; > float xMovement=0.0f; > float yMovement=0.0f; > private boolean movement_mode=false; > > public MySurfaceView(Context context, Bitmap image, int width, byte > horizontal, byte vertical) { > super(context); > this.context = context; > setEGLConfigChooser(8, 8, 8, 8, 16, 0); //fondo transparente > getHolder().setFormat(PixelFormat.TRANSLUCENT); //fondo > transparente > //Transformamos esta clase en renderizadora > this.setRenderer(this); > //Request focus, para que los botones reaccionen > this.requestFocus(); > this.setFocusableInTouchMode(true); > square = new Square(image); > this.horizontal=horizontal; > this.vertical=vertical; > } > > public void onSurfaceCreated(GL10 gl, EGLConfig config) { > MyGl=gl; > gl.glDisable(GL10.GL_DITHER); > //dithering OFF > gl.glEnable(GL10.GL_TEXTURE_2D); > //Texture Mapping ON > gl.glShadeModel(GL10.GL_SMOOTH); > //Smooth Shading > gl.glClearDepthf(1.0f); > //Depth Buffer Setup > gl.glEnable(GL10.GL_DEPTH_TEST); > //Depth Testing ON > gl.glDepthFunc(GL10.GL_LEQUAL); > gl.glClearColor(0,0,0,0); //fondo transparente > gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); > //Cargamos la textura del cubo. > square.loadGLTexture(gl, this.context); > } > > public void onDrawFrame(GL10 gl) { > //Limpiamos pantalla y Depth Buffer > gl.glClear(GL10.GL_COLOR_BUFFER_BIT | > GL10.GL_DEPTH_BUFFER_BIT); > gl.glLoadIdentity(); > //Dibujado > gl.glTranslatef(x, y, z); //Move z units > into the screen > //gl.glScalef(0.8f, 0.8f, 0.8f); > //Escalamos para que quepa en la > pantalla > //Rotamos sobre los ejes. > gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f); //X > gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f); //Y > gl.glRotatef(zrot, 0.0f, 0.0f, 1.0f); //Z > //Dibujamos el cuadrado > square.draw(gl); > mg.getCurrentProjection(gl); > mg.getCurrentModelView(gl); > > } > > //si el surface cambia, resetea la vista, imagino que esto pasa > cuando cambias de modo portrait/landscape o sacas el teclado físico en > móviles tipo Droid. > public void onSurfaceChanged(GL10 gl, int width, int height) { > if(height == 0) { > height = 1; > } > gl.glViewport(0, 0, width, height); //Reset Viewport > gl.glMatrixMode(GL10.GL_PROJECTION); //Select Projection > Matrix > gl.glLoadIdentity(); > //Reset Projection Matrix > //Aspect Ratio de la ventana > GLU.gluPerspective(gl, 45.0f, (float)width / (float)height, > 0.1f, > 100.0f); > gl.glMatrixMode(GL10.GL_MODELVIEW); //Select Modelview > Matrix > gl.glLoadIdentity(); > //Reset Modelview Matrix > } > > public boolean onTouchEvent(MotionEvent event) { > float [] outputCoords=getOpenGLCoords(event.getX(), > event.getY(), > 0); > x=(outputCoords[0]/outputCoords[3]); > y=(outputCoords[1]/outputCoords[3]); > //z=outputCoords[2]/outputCoords[3]; > Log.d("XXXXXXXXX", "X: "+x); > Log.d("XXXXXXXXX", "Y: "+y); > return true; //El evento ha sido manejado > } > > public float[] getOpenGLCoords(float xWin,float yWin,float zWin) > { > int screenW=SectionManager.instance.getDisplayWidth(); > int screenH=SectionManager.instance.getDisplayHeight(); > //CODE FOR TRANSLATING FROM SCREEN COORDINATES TO OPENGL > COORDINATES > float [] modelMatrix = new float[16]; > float [] projMatrix = new float[16]; > modelMatrix=mg.mModelView; > projMatrix=mg.mProjection; > int [] mView = new int[4]; > mView[0] = 0; > mView[1] = 0; > mView[2] = screenW; //width > mView[3] = screenH; //height > float [] outputCoords = new float[4]; > GLU.gluUnProject(xWin, ((float)screenH)-yWin, zWin, modelMatrix, > 0, projMatrix, 0, mView, 0, outputCoords, 0); > return outputCoords; > } > } > > > > -- > You received this message because you are subscribed to the Google > Groups "Android Developers" group. > To post to this group, send email to android-developers@googlegroups.com > To unsubscribe from this group, send email to > android-developers+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/android-developers?hl=en -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en