Download Revista JavaOpenGL
Document related concepts
no text concepts found
Transcript
CONTENIDO JOGL (Java OpenGL)…………………………………………….. 3 Características…………………………………………………….. 4 Funcionamiento…………………………………………………… 5 Implementación…………………………………………………… 8 Clases y Métodos…………………………………………………. 11 Sistema de Coordenadas………………………………………….. 16 Primitivas……………………………………………………….. 17 Ejemplos…………………………………………………………. 18 Estructura de una Pirámide………………………………………. 19 Transformaciones………………………………………………… 20 Visibilidad de Superficies………………………………………… 22 Animaciones……………………………………………………… 26 Aplicaciones……………………………………………………… 27 Ejemplos de Código……………………………………………… 29 Apuntes Extras…………………………………………………… 34 Es una de las Tecnologías OpenSource iniciado por: ―the Game Technology Group‖ y ―Sun Microsystems‖ en el año 2003 (JOGL – JOAL - Jinput) con el objetivo de proporcionar aceleración 3D por hardware a aplicaciones Java. Es una biblioteca que permite programar OpenGL desde Java M.Sc. Ing. Juan Pablo Luna Felipez Edad: 29 Docente de la Carrera Ing. Informática (UNSXX). Materia: Programación Gráfica OpenGL es la interfaz software de hardware gráfico. (Motor 3D cuyas rutinas están integradas en tarjetas graficas 3D Desarrollado por Sillicon Graphics Inc (SGI), en pro de hacer un estándar en la representación 3D gratuito y con código abierto (open source). Consta de unas 120 funciones. 38 Diseñado de forma independiente del hardware por lo que es multiplataforma No incluye comandos para gestionar ventanas, ni para capturar órdenes de usuarios 3 Puede combinarse con AWT y SWING. Acceso a la mayoría de características disponibles en C (excepto llamadas a ventanas). Soporte de las librerías GLU y GLUT. Soporte para animación, carga de texturas, archivos y captura de pantalla, etc. Trabaja como maquina de estados (un estado permanece activado hasta que se desactive). Sin soporte para sonido o dispositivos de entrada(JOAL and Jinput). 4 37 Diseño Clases de JOGL Para trabajar con JOGL se debe utilizar mínimamente cinco clases: GLCanvas ó GLPanel Utiliza la especificación JSR231 Acceso total a la API OpenGL 2.0 Llama a la API OpenGL gracias a la JNI JOGL simplemente expone las funciones de OpenGL, por medio de métodos contenidos en pocas clases (Wrapper). Desventaja: Al ser OpengL procedural y de máquina de estados es inconsistente con la forma habitual de programar en Java GLEventListener GLAutoDrawable GL Estas clases se encuentran en el package javax.media.opengl Ventaja: Conversión de código de aplicaciones C. 36 5 GLCanvas y GLPanel GLEventListener Interfaz que provee acceso para realizar funciones de dibujado, consta de 4 métodos: init(GLAutoDrawable g) Se ejecuta la primera vez, aquí se realizan tareas como la de carga de texturas o la fijacion de la perspectiva y la camara. display(GLAutoDrawable g) Es aquí donde se hace el dibujado reshape(GLAutoDrawable g, int x, int y, int ancho, int alto) Este método es llamado cuando la ventana cambia de tamaño displayChanged(GLAutoDr awable g, boolean b1, boolean b2) Se utiliza cuando se cambia de dispositivo de despliegue (gral. no utilizado) JOGL tiene dos clases ―containers‖ que permiten realizar las funciones de dibujado sobre ellos : GLCanvas GLJPanel Se puede utilizar cualquiera Es más veloz trabajar con GLCanvas. GLPanel es para compatibilidad con componentes SWING. En ambos se puede realizar el dibujado a través de la interface GLEventListener 6 35 GLAutoDrawable GLAutoDrawable es el elemento que permite acceder a las funciones de dibujado, es por eso que forma parte de los parámetros de la interfaz GLEventListener. Esta clase permite Obtener el contexto de dibujo a través de la clase GL. GL Es la clase principal que permite acceder directamente a las funciones de OGL. Se obtiene a partir de la clase GLAutoDrawable gl=g.getGL(); 34 7 1. Inicie NetBeans y entre en el menu Tools|Plugins. 2. Presione el botón add y elija la opción Downloaded plugins list y presione Install. 8 frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { bQuit = true; displayT.stop(); System.exit(0); } }); frame.setVisible(true); // frame.show(); canvas.requestFocus(); while( !bQuit ) { canvas.display(); } } } 33 public void keyReleased(KeyEvent e) { } 3. Vaya a la pestaña de Settings y asegúrese de que el centro de actualizaciones este habilitado. public void keyTyped(KeyEvent e) { } } JavaDia class—La clase principal enlaza la clase JavaRenderer. El código dibuja la escena en la GLCanvas. import import import import javax.media.opengl.GLCanvas; java.awt.Frame; java.awt.event.WindowAdapter; java.awt.event.WindowEvent; public class JavaDia implements Runnable { static Thread displayT = new Thread(new JavaDia()); static boolean bQuit = false; public static void main(String[] args) { displayT.start(); } public void run() { Frame frame = new Frame("Jogl 3d Shape/Rotation"); GLCanvas canvas = new GLCanvas(); canvas.addGLEventListener(new JavaRenderer()); frame.add(canvas); frame.setSize(640, 480); frame.setUndecorated(true); int size = frame.getExtendedState(); size |= Frame.MAXIMIZED_BOTH; frame.setExtendedState(size); 32 4. Cambie a la pestaña de Available Plugins, busque OpenGL y verifique que se encuentran todos los paquetes que se quieren instalar. 5. Finalice la instalación presionando Install. 9 public void displayChanged(GLAutoDrawable gLDrawable, boolean modeChanged, boolean deviceChanged) { } public void init(GLAutoDrawable gLDrawable) { final GL gl = gLDrawable.getGL(); gl.glShadeModel(GL.GL_SMOOTH); gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); gl.glClearDepth(1.0f); gl.glEnable(GL.GL_DEPTH_TEST); gl.glDepthFunc(GL.GL_LEQUAL); gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST); gLDrawable.addKeyListener(this); } public void reshape(GLAutoDrawable gLDrawable, int x, int y, int width, int height) { final GL gl = gLDrawable.getGL(); if(height <= 0) { height = 1; } final float h = (float)width / (float)height; gl.glMatrixMode(GL.GL_PROJECTION); gl.glLoadIdentity(); glu.gluPerspective(50.0f, h, 1.0, 1000.0); gl.glMatrixMode(GL.GL_MODELVIEW); gl.glLoadIdentity(); } 10 public void keyPressed(KeyEvent e) { if(e.getKeyCode() == KeyEvent.VK_ESCAPE) { JavaDia.bQuit = true; JavaDia.displayT = null; System.exit(0); } } 31 gl.glBegin(GL.GL_TRIANGLES); // Front gl.glColor3f(0.0f, 1.0f, 1.0f); gl.glVertex3f(0.0f, 1.0f, 0.0f); gl.glColor3f(0.0f, 0.0f, 1.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); gl.glColor3f(0.0f, 0.0f, 0.0f); gl.glVertex3f(1.0f, -1.0f, 1.0f); // Right Side Facing Front gl.glColor3f(0.0f, 1.0f, 1.0f); gl.glVertex3f(0.0f, 1.0f, 0.0f); gl.glColor3f(0.0f, 0.0f, 1.0f); gl.glVertex3f(1.0f, -1.0f, 1.0f); gl.glColor3f(0.0f, 0.0f, 0.0f); gl.glVertex3f(0.0f, -1.0f, -1.0f); // Left Side Facing Front gl.glColor3f(0.0f, 1.0f, 1.0f); gl.glVertex3f(0.0f, 1.0f, 0.0f); gl.glColor3f(0.0f, 0.0f, 1.0f); gl.glVertex3f(0.0f, -1.0f, -1.0f); gl.glColor3f(0.0f, 0.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); // Bottom gl.glColor3f(0.0f, 0.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); gl.glColor3f(0.1f, 0.1f, 0.1f); gl.glVertex3f(1.0f, -1.0f, 1.0f); gl.glColor3f(0.2f, 0.2f, 0.2f); gl.glVertex3f(0.0f, -1.0f, -1.0f); gl.glEnd(); rotateT += 0.2f; } 30 Clase GLUT Clase GLU Constructor: Constructor: public GLUT() public GLU() Métodos: Métodos: gluNewQuadric() public void glutWireSphere(double radius, int slices, int stacks) public void glutSolidSphere(double radius, int slices, int stacks) public void glutWireCone(double base, double height, int slices, int stacks) public void glutSolidCone(double base, double height, int slices, int stacks) public void glutWireCylinder(double radius, double height, int slices, int stacks) public void glutSolidCylinder(double radius, double height, int slices, int stacks) public void glutWireCube(float size) public void glutSolidCube(float size) public void glutWireTorus(double innerRadius, double outerRadius, int nsides, int rings) public void glutSolidTorus(double innerRadius, double outerRadius, int nsides, int rings) gluLookAt(double eyeX, double eyeY, double eyeZ, double centerX, double centerY, double centerZ, double upX, double upY, double upZ) gluCylinder(GLUquadric quad, double base, double top, double height, int slices, int stacks) 11 Para implementar esta interfaz se crea una clase para este propósito import javax.media.opengl.GLEventListener; import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.GL; class CJogl implements GLEventListener { public void init(GLAutoDrawable g) { } public void display(GLAutoDrawable g) { GL gl=g.getGL(); } public void reshape(GLAutoDrawable g, int x, int y, int ancho, int alto) { } public void displayChanged(GLAutoDrawable g, boolean b1, boolean b2) { Programación de una Pirámide 3D Este programa dibuja una pirámide 3D mediante JOGL. JavaRenderer class — Esta clase usa GLAutoDrawable para generar la escena. import import import import import import javax.media.opengl.GL; javax.media.opengl.GLEventListener; javax.media.opengl.GLAutoDrawable; javax.media.opengl.glu.GLU; java.awt.event.KeyEvent; java.awt.event.KeyListener; public class JavaRenderer implements GLEventListener, KeyListener { private float rotateT = 0.0f; private static final GLU glu = new GLU(); public void display(GLAutoDrawable gLDrawable) { final GL gl = gLDrawable.getGL(); gl.glClear(GL.GL_COLOR_BUFFER_BIT); gl.glClear(GL.GL_DEPTH_BUFFER_BIT); gl.glLoadIdentity(); gl.glTranslatef(0.0f, 0.0f, -5.0f); gl.glRotatef(rotateT, gl.glRotatef(rotateT, gl.glRotatef(rotateT, gl.glRotatef(rotateT, } } 12 1.0f, 0.0f, 0.0f, 0.0f, 29 0.0f, 1.0f, 0.0f, 1.0f, 0.0f); 0.0f); 1.0f); 0.0f); GLCanvas se puede añadir como un componente en un JFrame import javax.swing.JFrame; import javax.media.opengl.GLCanvas; class CVentana extends JFrame { CVentana() { this.setTitle("Programa JOGL"); this.setExtendedState(this.MAXIMIZED_BOTH); this.setDefaultCloseOperation(this.EXIT_ON_CLOSE); GLCanvas c=new GLCanvas(); c.addGLEventListener(new CJogl()); this.getContentPane().add(c); this.show(); } } 28 13 14 27 Este programa dibuja una pirámide 3D mediante JOGL. Una animación simplemente es un bucle de la función de dibujado Con el objeto Animator conseguimos ese bucle y además conseguimos el trato concurrente y la posibilidad de poder fijar la frecuencia de redibujado. Animator animator = null; Animator = new Animator(GLCanvas objeto); Animator.start(); Animator.stop(); 26 15 Establecer el tipo de Material gl.glMaterialf(int, int, float); JOGL Maneja el sistema de cordenas como se muestra en la figura: GLenum Face GLenum pname GL_FRONT GL_DIFFUSE Const *params (R,G,B,1.0) GL_BACK GL_AMBIENT (R,G,B,1.0) GL_FRONT_A ND_BACK GL_AMBIENT_AND_D IFFUSE GL_EMISION GL_SPECULAR GL_SHININESS (R,G,B,1.0) GLFloat (R,G,B,1.0) (R,G,B,1.0) [0,128] COLOR gl.glMaterialfv(gl.GL_FRONT_AND_BACK*, gl.GL_AMBIENT,val*); gl.glMaterialfv(gl.GL_FRONT_AND_BACK*, gl. GL_DIFUSSE,val*); gl.glMaterialfv(gl.GL_FRONT_AND_BACK*, gl. GL_AMBIENT_AND_DIFUSSE,val*); gl.glMaterialfv(gl.GL_FRONT_AND_BACK*, gl. GL_SPECULAR,val*); *Se puede utilizar tambien GL_FRONT, GL_BACK *val es un vector de tres componentes {R,G,B,A} que especifica el color. (Es habitual que el comportamiento ante la luz difusa y la ambiental sea el mismo) 16 25 LUCES (ILUMINACION) Plana o FLAT Suave o SMOOTH/GOURAUD Iluminación PHONG Punto Línea Triangulo Cuadrado Polígono, etc. ILUMINACION FLAT gl.glShadeModel(gl.GL_FLAT); Iluminación SMOOTH gl.glShadeModel(gl.GL_SMOOTH); Materiales Se debe asociar un tipo de material al poligono “Una primitiva es simplemente la interpretación de un conjunto de vértices, dibujados de una forma específica en pantalla” Características de un material: Reflexión Difusa (difusse) Reflexión Espectacular (specular) Reflexión Ambiental (ambient) Coeficiente de Brillo (shininess) Coeficiente de Emisión (emissión) 24 17 Modo Ortogonal PASOS PARA USAR LUCES gl.glOrtho(xmin,xmax,ymin,ymax,zm 1) Activar el uso de luces in,zmax); gl.glEnable(gl.GL_LIGHTING); 2) Posicionar la camara 2) Definir las carácterísticas de cada glu.gluLookAt(posx,posy,posz,ojox,o luz joy,ojoz,vx,vy,vz); gl.glLigthfv(…); 3) Definir las caracteristicas de los materiales de los objetos gl.glMaterialfv(…); 4) Activar luces gl.glEnable(gl.GL_LIGHTn); LUCES Permite dar mayor realismo a la escena Esiten tres tipos de luces: 18 23 1) Activar el ocultamiento de objetos gl.glEnable(gl.GL_DEPTH_TES T); MANEJO DE LA CAMARA Permite mover nuestro punto de vista en toda aplicación grafica para mirar al punto que se desee 2) Indicar que se renderize las partes visibles gl.glClear(gl.GL_COLOR_BUFF ER_BIT|gl.GL_DEPTH_BUFFE R_BIT); Establecer el modo de vista gl.glBegin(primitiva); /* definir vertices que conforman la primitiva */ glEnd(); Ejemplo gl.glBegin(gl.GL_TRIANGLES); { gl.glColor3f(1f,0f,0f); gl.glVertex(-1f,0f,0f); gl.glColor3f(0f,1f,0f); gl.glVertex(1f,0f,0f); gl.glColor3f(0f,0f,1f); gl.glVertex(0f,1f,0f); } glEnd(); Modo Perspectiva glu.gluPerspective(angulo,aspecto* ,vistaCercana,vistaLejana) *aspecto=Relación ancho alto 3) Desactivar el ocultamiento de objetos gl.glDisable(gl.GL_DEPTH_TES T); 22 19 PUNTOS gl.glPointSize(5.0f); TRASLACION gl.glTraslatef(float,float,float); ROTACIÓN gl.glRotatef(float, float,float,float); ESCALACIÓN gl.glScalef(float,float,float); Otras… LINEAS GLLINES Líneas sueltas GL_LINE_STRIP Líneas conectadas GL_LINE_LOOP Líneas conectadas mas la última con la primera TRIÁNGULOS GL_TRIANGLES Dibuja un triángulo GL_TRIANGLE_STRIP Dibuja varios triángulos conectados CUADRADOS GL_QUADS Dibuja cuadrados GL_QUAD_STRIP Dibuja cuadrados conectados COLORES gl.glColor3f(r,g,b); Establece un color con el sistema RBG Rellena con el último color activo gl.glShadelModel(GL_SMOOTH) Rellena en degrado con los color definidos para cada vértice OCULTAR OBJETOS NO VISIBLES gl.glEnable(gl.GL_DEPTH_TEST) ; Activa el ocultamiento de objetos gl.glDisable(gl.GL_DEPTH_TEST ); Desactiva el ocultamiento de objetos BORRAR FONDO gl.glClear(gl.GL_COLOR_BUFFE R_BIT) Borra con el color establecido en el buffer con gl.glClearColor gl.glClear(gl.GL_COLOR_BUFFE R_BIT|gl.GL_DEPTH_BUFFER_ BIT); Borra con el color establecido en el buffer con gl.glClearColor y las partes ocultas RELLENADO DE POLIGONOS gl.glShadelModel(GL_FLAT) 20 21