I need to show a square polygon with the 100% of the width of the
screen, then, i supose that i must zoom it (with Z axis) until the
polygon borders are tounching the screen borders.

I'm trying to achieve this using gluProject to project a coordinate in
3D into a 2D screen coordinate. If the screen coordinate is either 0
or matches the width or height, then it is touching a screen border.

The problem is that something is going wrong, the `outputCoords` array
returned with gluProject is giving me these values: 0,0,0.5,  but my
square is centered on the sreen, and with Z=-5.0f!!!!

I dont understand these values...

This is the code i'm using to obtain the 2D Projection of my square
poligon on the screen:


    /////////////// NEW CODE FOR SCALING THE AR IMAGE TO THE DESIRED
WIDTH /////////////////

            mg.getCurrentModelView(gl);
            mg.getCurrentProjection(gl);

            float [] modelMatrix = new float[16];
            float [] projMatrix = new float[16];
            modelMatrix=mg.mModelView;
            projMatrix=mg.mProjection;
            int [] mView = new int[4];
            // Fill this with your window width and height
            mView[0] = 0;
            mView[1] = 0;
            mView[2] = 800; //width
            mView[3] = 480; //height
            // Make sure you have 3 components in this array even if the
screen only needs 2
            float [] outputCoords = new float[3];
            // objX, objY, objZ are the coordinates of one of the borders
            GLU.gluProject(-1.0f, -1.0f, 0.0f, modelMatrix, 0,
projMatrix, 0, mView, 0, outputCoords, 0);


This is my square class:

    public class Square {
        //Buffer de vertices
        private FloatBuffer vertexBuffer;
        //Buffer de coordenadas de texturas
        private FloatBuffer textureBuffer;
        //Puntero de texturas
        private int[] textures = new int[3];
        //El item a representar
        private Bitmap image;
        //Definición de vertices

        private float vertices[] =
        {
                -1.0f, -1.0f, 0.0f,     //Bottom Left
                1.0f, -1.0f, 0.0f,              //Bottom Right
                -1.0f, 1.0f, 0.0f,              //Top Left
                1.0f, 1.0f, 0.0f                //Top Right
        };

        private float texture[] =
        {
        //Mapping coordinates for the vertices
        0.0f, 1.0f,
        1.0f, 1.0f,
                0.0f, 0.0f,
        1.0f, 0.0f
    };
        //Inicializamos los buffers
        public Square(Bitmap image) {
                ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length 
* 4);
                byteBuf.order(ByteOrder.nativeOrder());
                vertexBuffer = byteBuf.asFloatBuffer();
                vertexBuffer.put(vertices);
                vertexBuffer.position(0);

                byteBuf = ByteBuffer.allocateDirect(texture.length * 4);
                byteBuf.order(ByteOrder.nativeOrder());
                textureBuffer = byteBuf.asFloatBuffer();
                textureBuffer.put(texture);
                textureBuffer.position(0);

                this.image=image;
        }
        //Funcion de dibujado
        public void draw(GL10 gl) {
                gl.glFrontFace(GL10.GL_CCW);
                //gl.glEnable(GL10.GL_BLEND);
                //Bind our only previously generated texture in this case
                gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
                //Point to our vertex buffer
                gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
                gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
                //Enable vertex buffer
                gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
                gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
                //Draw the vertices as triangle strip
                gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);
                //Disable the client state before leaving
                gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
                gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
                //gl.glDisable(GL10.GL_BLEND);
        }
        //Carga de texturas
        public void loadGLTexture(GL10 gl, Context context) {
                //Generamos un puntero de texturas
                gl.glGenTextures(1, textures, 0);
                //y se lo asignamos a nuestro array
                gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
                //Creamos filtros de texturas
                gl.glTexParameterf(GL10.GL_TEXTURE_2D, 
GL10.GL_TEXTURE_MIN_FILTER,
GL10.GL_NEAREST);
                gl.glTexParameterf(GL10.GL_TEXTURE_2D, 
GL10.GL_TEXTURE_MAG_FILTER,
GL10.GL_LINEAR);
                //Diferentes parametros de textura posibles 
GL10.GL_CLAMP_TO_EDGE
                gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,
GL10.GL_REPEAT);
                gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,
GL10.GL_REPEAT);
                /*
                String imagePath = "radiocd5.png";
            AssetManager mngr = context.getAssets();
            InputStream is=null;
                try {
                        is = mngr.open(imagePath);
                } catch (IOException e1) {      e1.printStackTrace();   }
                */
                //Get the texture from the Android resource directory
                InputStream is=null;
            /*
                if (item.equals("rim"))
                is = context.getResources().openRawResource(R.drawable.rueda);
            else if (item.equals("selector"))
                is =
context.getResources().openRawResource(R.drawable.selector);
                */
                /*
                is = context.getResources().openRawResource(resourceId);
                Bitmap bitmap = null;
                try {
                        bitmap = BitmapFactory.decodeStream(is);
                } finally {
                        try {
                                is.close();
                                is = null;
                        } catch (IOException e) {
                        }
                }
                */
                Bitmap bitmap =image;
                //con el siguiente código redimensionamos las imágenes que sean 
mas
grandes de 256x256.
                int newW=bitmap.getWidth();
                int newH=bitmap.getHeight();
                float fact;
                if (newH>256 || newW>256)
                {
                        if (newH>256)
                        {
                                fact=(float)255/(float)newH; //porcentaje por 
el que multiplicar
para ser tamaño 256
                                newH=(int)(newH*fact); //altura reducida al 
porcentaje necesario
                                newW=(int)(newW*fact); //anchura reducida al 
porcentaje necesario
                        }
                        if (newW>256)
                        {
                                fact=(float)255/(float)newW; //porcentaje por 
el que multiplicar
para ser tamaño 256
                                newH=(int)(newH*fact); //altura reducida al 
porcentaje necesario
                                newW=(int)(newW*fact); //anchura reducida al 
porcentaje necesario
                        }
                        bitmap=Bitmap.createScaledBitmap(bitmap, newW, newH, 
true);
                }
                //con el siguiente código transformamos imágenes no potencia de 
2 en
imágenes potencia de 2 (pot)
                //meto el bitmap NOPOT en un bitmap POT para que no aparezcan
texturas blancas.
                int nextPot=256;
                int h = bitmap.getHeight();
                int w = bitmap.getWidth();
                int offx=(nextPot-w)/2; //distancia respecto a la izquierda, 
para
que la imagen quede centrada en la nueva imagen POT
                int offy=(nextPot-h)/2; //distancia respecto a arriba, para que 
la
imagen quede centrada en la nueva imagen POT
                Bitmap bitmap2 = Bitmap.createBitmap(nextPot, nextPot,
Bitmap.Config.ARGB_8888); //crea un bitmap transparente gracias al
ARGB_8888
                Canvas comboImage = new Canvas(bitmap2);
                comboImage.drawBitmap(bitmap, offx, offy, null);
                comboImage.save();

                //Usamos Android GLUtils para espcificar una textura de 2
dimensiones para nuestro bitmap
                GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap2, 0);

                //Checkeamos si el GL context es versión 1.1 y generamos los 
Mipmaps
por Flag. Si no, llamamos a nuestra propia implementación
                if(gl instanceof GL11) {
                        gl.glTexParameterf(GL11.GL_TEXTURE_2D, 
GL11.GL_GENERATE_MIPMAP,
GL11.GL_TRUE);
                        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap2, 0);
                } else {
                        buildMipmap(gl, bitmap2);
                }
                //Limpiamos los bitmaps
                bitmap.recycle();
                bitmap2.recycle();
        }
        //Nuestra implementación de MipMap. Escalamos el bitmap original
hacia abajo por factor de 2 y lo asignamos como nuevo nivel de mipmap
        private void buildMipmap(GL10 gl, Bitmap bitmap) {
                int level = 0;
                int height = bitmap.getHeight();
                int width = bitmap.getWidth();
                while(height >= 1 || width >= 1) {
                        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, level, bitmap, 
0);
                        if(height == 1 || width == 1) {
                                break;
                        }
                        level++;
                        height /= 2;
                        width /= 2;
                        Bitmap bitmap2 = Bitmap.createScaledBitmap(bitmap, 
width, height,
true);
                        bitmap.recycle();
                        bitmap = bitmap2;
                }
        }
    }

-- 
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