Anteriormente vimos cómo dibujar un hexágono, octágono y un círculo con JOGL pero nunca redimensionamos el frame que los contenía. ¿La razón? pues porque no habíamos modificado el método reshape() utilizado por la interfaz GLEventListener, entonces, al redimensionar un frame puede ocurrir que nuestra figura se distorsione tal y como se ve en ésta imagen:
Para evitar lo anterior, debemos modificar el código contenido dentro del método reshape() de la siguiente manera:
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height)
{
// Cargamos la proyección de nuestra imagen
gl.glMatrixMode (GL.GL_PROJECTION);
gl.glLoadIdentity ();
// Cuando el alto es más grande que el ancho
if (w <= h)
{
// Modificamos el fondo (bottom) y la parte de arriba (top) de
// tal manera que no se deforme nuestra figura
gl.glOrtho(-xRange, xRange,
-yRange * ((float)h/(float)w), yRange * ((float)h/(float)w), -zRange, zRange);
}
// Cuando el ancho es más grande que el alto
else
{
// Modificamos el lado izquierdo (left) y el lado derecho (right) de
// tal manera que no se deforme nuestra figura
gl.glOrtho(-xRange * ((float)w/(float)h), xRange * ((float)w/(float)h),
-yRange, yRange, -zRange, zRange);
}
// Se carga el punto de vista del modelo
// con las nuevas dimensiones (width, height)
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glViewport(x, y, width, height);
// Redibujamos el objeto
canvas.repaint ();
}
Como se puede apreciar en el método anterior, hemos utilizado tres variables nuevas: xRange, yRange, zRange, dichas variables definirán nuestro espacio de trabajo y deben ser declaradas e inicializadas en el constructor de nuestro programa:
float xRange = 5.0f;
float yRange = 5.0f;
float zRange = 5.0f;
Con lo anterior, nuestro espacio de trabajo seguirá comprendiendo los rangos:
- x = [-5,5]
- y = [-5,5]
- z = [-5,5]
- GLAutodrawable drawable
- int x
- int y
- int width
- int height
Si desean descargar el código fuente pueden dar click en el siguiente enlace:
Descargar código fuente dibujarCircunferenciaNODeforme.java
Leer más...