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 [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to