If all you need is to zoom a quad why don't you just glScale() it? Moving the quad along the z axis will sure work but it seems like the hard way to achieve this. Sure, scaling and moving along z will not get you the *exactly* same result, however I doubt anybody could appreciate the slight differences between a bilinear filter and (generally) tiny perspective distortion, given your geometry is not quite hi-res. :-)
On Wed, Nov 2, 2011 at 1:42 PM, saex <[email protected]> wrote: > 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 -- 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

