Graficación
M.C. Juan Carlos Olivares Rojas
Agenda
• Diseño de juegos con DirectX.
• OpenGL.
• Java3D.
Introducción
• Los sistemas de graficación se basan a través de primitivas de dibujo en pantalla en 2D. Dichas primitivas generalmente son el punto, la línea, figuras geométricas como el rectángulo, la elipse, etc.
• A pesar de basarse en elementos en 2D se pueden crear figuras 3D cambiando las perspectivas y definiendo volumen a las figuras.
Introducción
• Con la utilización de estas APIs básicas para el manejo de elementos gráficos, en la pantalla se pueden construir sistemas para realizar gráficos, videojuegos, elementos gráficos del sistema operativo, etc.
• Las APIs de graficación en la gran mayoría de los casos dependen del lenguaje de programación utilizado para programarlas.
Introducción
• En este curso describiremos las APIs básicas para el manejo de gráficos en Java.
• La clase más básica es la Graphics, la cual tiene métodos que nos permiten dibujar sobre un lienzo Canvas.
• Generalmente se utilizan dentro del método paint() de un Applet o de una aplicación gráfica.
Introducción
• Los métodos repaint() y update son variantes del método paint().
• El método repaint() se utiliza cuando se desea volver a dibujar la pantalla (lo cual es muy frecuente en los sistemas gráficos multitarea) y dibuja toda la pantalla. El método update() sólo actualiza una región de la pantalla. Muy utilizado en componentes gráficos como botones o listas desplegables.
Introducción
• La clase Graphics se encuentra dentro del paquete java.awt.*;
• El método drawString() permite dibujar una cadena de texto en la pantalla.
• El método drawLine() dibuja una línea en la pantalla. El método drawRectangle() permite dibujar un rectángulo en pantalla.
Introducción• El método drawOval permite definir óvalos y circulos.
El método drawImage() permite mostrar imágenes en pantallas.
• El método clearRect() permite borrar un área de la pantalla. El método copyArea() copia un área de memoria. Esto se utiliza en los métodos de recorte (clip).
• Métodos como drawPolygon y drawPolyline() permiten definir figuras más elaboradas.
Introducción
• Los métodos que inician con fill, como fillOval(), fillRect(), etc., realizan las mismas figuras pero pintan el relleno de las figuras.
• Otros elementos a considerar para el manejo de gráficos son el color y las fuentes (tipos de letras). Java define clases para manipular estos objetos gráficos de manera amplia.
Introducción• Los métodos getFont(), setFont(), getColor() y
setColor() permiten manipular fuentes y colores.
• La clases Font y Color se encuentran definidas también en java.awt.*
• El método translate() de Graphics() permite cambiar el punto de referencia que de manera predeterminada es 0,0 para esquina superior izquierda.
Introducción
• La clase Color define el modelo de color a emplear, cuenta con algunas constantes para cada tipo de color como orange, yellow, darkgray, etc. El color está dado por tres valores uno para el rojo, otro para el verde y otro para el azul.
• Se cuentan además con métodos para manipular los atributos de la clase.
Introducción
• La clase Font permite el manejo de fuentes en pantalla. El constructor de esta clase recibe tres argumentos: el nombre de la fuente, el estilo de la fuente y el tamaño.
• El estilo de la fuente está definido por tres constantes PLAIN (normal), BOLD (negrita) e ITALIC (cursiva). Se cuenta además con métodos auxiliares para manipular los atributos de la clase.
Introducción
• Una fuente no es otra cosa que una colección de imágenes que representan los caracteres de un sistema.
• Se cuenta además con la clase FontMetrics que define algunas métricas de la fuente: altura, bajada, la subida, la interlínea, etc.
Introducción
• También se pueden dibujar figuras 3D muy sencillas con métodos como draw3DRect y fill3DRect que dan profundidad a las imágenes.
Introducción• Se puede obtener el contexto gráfico de una
imagen y manipularla como si fuera un objeto Graphics. Ejemplo:
Font letra = Font.getFont(Font.FACE_MONOSPACE, Font.SIZE_SMALL, Font.STYLE_PLAIN);
Image logo = Image.createImage(letra.stringWidth(“Hi!”))
Graphics gr = logo.getGraphics();
…
Introducción
• En otro tipo de aplicaciones como en el caso de las aplicaciones para dispositivos móviles, también se pueden manipular gráficos de formas muy similares.
• El 80% de los programas de aplicación de J2ME (Java 2 Micro Edition) son juegos.
• Se sigue manipulando la clase Canvas con sus respectivos métodos y algunas variantes.
Introducción
• En el caso de aplicaciones móviles se sigue manejando la clase Graphics pero dentro de otro paquete: javax.microedition.midlet.* y javax.microedition.lcdui.*, dependiendo del tipo de aplicación desarrollada.
• Las clases están dentro de diferentes Frameworks, por lo que en aplicaciones de J2SE no se pueden mezclar y confundir.
Introducción
• Las aplicaciones gráficas para móviles se manejan muy parecido a lo que son aplicaciones convencionales, sólo es necesario extender la clase MIDlet.
• La clase MIDlet tiene los métodos de startApp(), pauseApp() y destroyApp(). Para manipulación de gráficos se cuenta con el método paint() y variantes.
Introducción
• Existen algunas APIs especiales para el manejo de gráficos en dispositivos móviles como los definidos por Nokia (com.nokia.mid.ui) que contiene clases como DirectGraphics.
• También se pueden manejar otro tipos de elementos como multimedia, sprites, etc. También se cuenta con la clase Graphic3D para gráficas en 3D.
DirectX
• La forma estándar de dibujar en el sistema operativo Windows es a través del GDI (Graphic Device Interface) que forma un anexo a la API Win32 y Win64.
• Actualmente se utiliza GDI+ que es una versión simplificada de la API ampliamente utilizada por .Net, se debe de utilizar el nombre de espacio System.Drawing.
DirectX
• Algunas de las clases con las que se cuenta en este namespace son: BitMap, Brush, Brushes, Font, FontFamily, Graphics, Icon, Image, Pen y Pens, Region, SolidBrush; Enumeraciones como: FontStyle, Estructuras como: Color, Point, PointF, Rectangle, RectangleF, Size y SizeF.
• Tambien se sobreescribe el método OnPaint() para dibujar.
DirectX.
• DirectX es un conjunto de componentes creados por Microsoft para el manejo de gráficos y sonidos de altas prestaciones utilizado en sistemas gráficos robustos como lo son videojuegos y algunas herramientas de autoría.
• Se tiene acceso directo al conjunto de instrucciones del microprocesador como MMX, SSE, SSE2, 3DNow de AMD, etc.
DirectX
• Se puede manejar más fácilmente esta API con el uso de algunas extensiones, tal es el caso de .Net Framework en donde se manejan clases de envolturas denominadas MDX (Managed DirectX).
• Se debe incluir el espacio de nombres microsoft.DirectX. Direct3D.
DirectX
• Algunas clases útiles son Device, CustomVertex, Render, etc.
• DirectX es la base para la mayoría de los juegos desarrollados en Windows. Por este motivo, Microsoft ha diseñado un framework denominado XNA para la programación de videojuegos.
OpenGL
• Fue diseñada por SGI en 1992, es la librería de gráficos más utilizada para el procesamiento de imágenes en 3D.
• Se utiliza en todo tipo de arquitecturas, desde Windows, Unix, Mac OS X hasta consolas de videojuegos como PS3.
OpenGL
• Existen diversas APIs pero la más estructuradas son con respecto a lenguajes como C.
• Las funciones generalmente comienzan con el prefijo gl. Ejemplo: glClear(), glMatrixMode(), glTranslatef(), glFrustum(), glBegin(), glColor3f(), glVertex3f(), glEnd().
OpenGL
• Existen extensiones de terceros para poder realizar algunos cálculos especiales, por ejemplo, para ciertas tarjetas de video 3D se cuentan con funciones especiales.
• Actualmente la librería está cobrando un costo módico por hacer uso de ella en productos comerciales.
Java3D
• Es una API para procesamiento digital de imágenes en 3D en lenguaje java, la cual basa su funcionamiento en OpenGL o DirectX.
• Se deriva del paquete javax.media.j3d.* También se utilizan las clases java.awt.*, y javax.vecmath.*
Java3D
• A continuación se describen de manera muy generalizada algunas clases del framework de Java3D:
• Transform3D: Permite definir transformaciones de figuras 3D.
• Canvas3D: Es el elemento que nos permite dibujar en pantalla las figuras geométricas.
Java3D
• BranchGroup: nos permite definir un escenario compuesto de la agrupación de varios elementos en pantalla.
• GraphicsConfiguration permite definir y obtener las características de la imagen.
• TransformGroup: permite definir un grupo de figuras 3D que modificarán su comportamiento como si fueran una unidad.
¿Preguntas?