Beruflich Dokumente
Kultur Dokumente
Estos cambios fueron realizados por Oscar Javier Abaunza García, docente de la
UNAD, CEAD Bucaramanga, ingeniero de sistemas, especialista en educación
superior a distancia, en su desempeño como tutor y director del curso a nivel
nacional.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
INTRODUCCIÓN
hacer
personas posible el uso de fue
no especialistas esteel sofisticado elemento
aliciente para (el gran computador)
que los investigadores por
de múltiples
institutos y universidades plantearan la posibilidad de realizar un computador con
una pantalla de monitor que permitiera visualizar los datos de diferentes formas, al
igual que dispositivos que hicieran posible la interacción humano-máquina de forma
intuitiva. Aparece entonces la idea de la computación gráfica.
Después de esto, su evolución vertiginosa está estrechamente relacionada con dos
componentes: el mundo de los videojuegos y del cine animado. De hecho, los
grandes ejemplos de los logros en los algoritmos, hardware y software para diseño
asistido por computador son en su mayoría de estas áreas de trabajo.
Esta primera unidad busca familiarizarlo con la evolución del concepto de
computación gráfica, los diferentes hitos que marcan su historia y algunos
conceptos fundamentales necesarios para su efectivo estudio.
Intencionalidades Formativas
Propósitos
Aportar a la fundamentación teórica del estudiante, como base para la
construcción de un discurso coherente y sustentado, a través de la
profundización en la terminología, fundamentos tecnológicos, físicos y
matemáticos de la representación gráfica en el computador.
Objetivos
Comprender y emplear los diferentes conceptos relacionados con la
representación de gráficos en el computador y los componentes de hardware
y software necesarios partiendo de los fundamentos teóricos y tecnológicos
de esta disciplina.
Identificar el establecimiento de un sistema de coordenadas en la pantalla
del computador como base fundamental para la graficación a través del
estudio de los fundamentos matemáticos que la estructuran.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Competencias
El estudiante describe y caracteriza de manera adecuada los conceptos y
elementos tecnológicos relacionados con la presentación de gráficos en el
computador.
Metas
Productos de Aprendizaje
Individual
Lectura autorregulada de la Unidad Didáctica realizando fichas textuales y
mapas conceptuales para archivar en el portafolio.
Construir un glosario con los términos desconocidos y su correspondiente
significado.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
fácil la formulación
entonces incorporardela problema; la simbiosis
la computadora del hombre
de manera íntimay en
la máquina pretendería
todo el proceso de
formulación y solución de problemas técnicos, logrando así integrarse
efectivamente en los procesos del pensamiento.
En un trabajo posterior con Clark en 1962, ellos listan aplicaciones en el área
militar, programación, juegos de guerra, planificación, educación, investigación
científica. Con una extraordinaria visión listan algunos problemas cuyas soluciones
son prerrequisitos para una verdadera simbiosis entre el hombre y la computadora.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
A corto plazo:
Ya en los
gráficos años 50’s
y dibujos tan era
bienobvio
como que el computador
el texto podía
o los números manipular
(oscillon, imágenes
wirlwind, son
el juego
spacewar y sage ya se habían construido). Se comienza entonces a explorar el
potencial de la comunicación gráfica entre el hombre y la máquina. Fue IVAN
SUTHERLAND en su trabajo pionero en el MIT Lincoln Laboratory llamado el
sistema 'Sketchpad'.
Este programa permitía dibujar formas
simples en la pantalla de un computador
mediante un lápiz óptico, salvarlas y volver
a cargarlas más tarde.
Sketchpad supuso una revolución en los
programas gráficos. Muchas de las técnicas
inventadas para este programa se siguen
usando hoy en día, sin embargo lo
realmente revolucionario de sketchpad era
la estructura de datos empleada. Se trataba
Figura 1 Ivan Sutherland y el Sketchpad
de un modelo del objeto a representar y no
sólo un dibujo del mismo.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
en 1972 crea
Sutherland el se
(E&S) primer videojuego
encontraban ya de "máquina"
fabricando (arcade),propio
hardware Pong.para
Evans
evitary
algunas de las limitantes tecnológicas que algunos años antes habían
experimentado. Uno de los sistemas más impresionantes creó precisamente por
E&S era "Picture System", incluía una tableta gráfica y un buffer en color. Triple I,
en 1974 desarrolló un equipo para poder filmar las imágenes realizadas en
computadora. Otro de sus inventos fue la creación de aceleradores gráficos. Los
desarrollos de Triple I fueron un gran avance que permitía que las gráficas
sintéticas pudieran ser utilizadas en cine.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Theory of Fractal
es un espacio Sets", explica
bidimensional; no que una línea
obstante, si la es un describe
línea objeto unidimesional,
una curva de el plano
manera
que cubra la superficie del plano deja de ser unidimensional, aunque tampoco es
bidimensional.
El Dr. Mandelbrot se refirió a este espacio
como una dimensión fraccionaria. Las
aplicaciones principales que se le dieron a
las teorías de Mandelbrot fueron la de
creación de terrenos aleatorios, así como la
creación de texturas en las cuales existen
subdivisiones dentro de un mismo patrón.
Después
contratadodeporsu graduación,
la empresa Catmull
Applicon, fue
donde
no duró mucho tiempo, ya que recibió una
Figura 3 Modelo de terreno usando oferta de trabajo para fundar el laboratorio
geometría fractal de animación por computadora del Instituto
Tecnológico de Nueva York (NYIT).
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
profundidad.
provocan que laLos colores
superficie tengamapeados
un relieve
o una depresión. Las partes blancas de la
imagen son representadas como
protuberancias, mientras las partes
oscuras representan las depresiones. Figura 4 Aplicación de texturas y relieves
con “bump map”
Lección 4 La revolución
Sin duda la década de cambios más vertiginosos fue la de 1980. El surgimiento de
las máquinas PC, aunque con capacidades gráficas limitadas, permitió la
popularización de sistemas y aplicaciones que crearon un mercado exigente y
competitivo (por ejemplo con el Autocad). También comenzaron a diseñarse
herramientas gráficas de interfaz hombre máquina, como por ejemplo el sistema
operativo de la Macintosh II, los lenguajes de programación visual y el hipertexto. El
rol que no alcanzaron a cumplir los Comités de estandarización (por ejemplo, el
GSK fue aprobado recién en 1985, cuando hacía varios años que ya era obsoleto)
fue cubierto por las compañías comerciales que al crear una aplicación novedosa
se transformaban en estándares de facto en el mercado (por ejemplo el Poscript, el
OpenGL y X Windows).
También esta década marcó el segundo cambio de paradigma, porque la evolución
de los modelos gráficos, junto con la capacidad de representación de los monitores
y la integración de los sistemas gráficos a otro tipo de aplicaciones (simulaciones
en ingeniería, sensores remotos, datos de satélites, etc.) permitió desarrollar
herramientas para la representación gráfica de conjuntos enormemente complejos
de datos. Estas
Científica, apelanideas, que concapacidad
a la enorme el tiempo fueron el fundamento
de comprensión visualdehumana.
la Visualización
De esa
manera es posible representar, por ejemplo, millones de datos meteorológicos en
un único gráfico que permite comprender a golpe de vista las características
esenciales de una determinada situación climática.
La popularización de la computación gráfica
significó, además, el surgimiento y
desarrollo de aplicaciones en las áreas más
diversas. Durante los ‘80 comenzaron a
utilizarse herramientas gráficas para el
diseño en Ingeniería en todas sus
actividades, desde aviones y barcos hasta
circuitos integrados. En Arquitectura e
Ingeniería Civil se utilizan sistemas para la
simulación, el diseño y la elaboración y
análisis de modelos. En Medicina podemos
mencionar desde el diagnóstico por
imágenes hasta la simulación y
Figura 5 Computación gráfica en planeamiento de operaciones quirúrgicas o
diferentes ámbitos el desarrollo de implantes.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
1950
o Ben Laposky creó las primeras imágenes gráficas, un osciloscopio,
generado por una máquina electrónica (análoga). La imagen fue
producida manipulando vigas electrónicas y registrándolas sobre una
película alta de la velocidad.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
1951
o UNIVAC-I: la primera computadora comercial de propósito general,
usaba dispositivos en copia dura e impresoras de línea.
o MIT – WirldWind: la primera computadora que permitía mostrar vídeo
en tiempo real, era capaz de exhibir texto y eráfico en tiempo real en
una pantalla grande de osciloscopio.
En los años 60: El comienzo de los gráficos interactivos modernos, salida son
gráficos vectoriales y gráficos interactivos. Uno de los grandes problemas era el
costo y la inaccesibilidad de las máquinas.
1960
o Guillermo Fetter acuña el término computación gráfica para describir
nuevos métodos de diseño
1961
o Steve Russel, primer juego de video Spacewars
1963
o Douglas Englebart - primer ratón
o Ivan Sutherland - Sketchpad. Sistema interactivo de CG, un sistema
gráfico de comunicación humano-computadora.
Menús pop-up
Modelamiento jerárquico
Utilizó un lápiz de luz para la interacción.
o Sutherland formuló las ideas de usar primitivas para el dibujo de
líneas, polígonos, arcos, etc.; desarrolló los algoritmos de dragging,
rubberbanding y transformación; introdujo las estructuras de datos
para almacenar. Es considerado el fundador de los gráficos por
computadora.
1964
o Guillermo Fetter - Primer modelo por computador de una figura
humana
1965
o Jack Bresenham - Algoritmo para el dibujo de líneas
1968
o Tektronix - Un computador basado en tubos de rayos catódicos, que
permitía el almacenamiento, el teclado y el ratón, un computador con
una interfaz simple de US$15.000, que permitía el uso de gráficos.
o Ivan Sutherland – Primer display head-mounted
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
1969
o Jhon Warnock - Algoritmo de la subdivisión de área, algoritmos de
superficies ocultas.
o Laboratorios Bell – Primer frambuffer que contiene 3 bits por pixel.
Al inicio dedelos
capacidad los años 70:esComienzo
gráficos de la salida usando dispositivos ráster, la
cada vez mayor.
1972
o Nolan Kay Bushnell - Pong, juego de video
1973
o Juan Whitney Jr. y Gary Demos - "Westworld", primera película con
gráficos de computador
1974
o Edwin Catmuff - mapeo de texturas y algoritmo z-buffer para
superficies ocultas.
o James Blinn - superficies curvas y refinamiento del algoritmo de
mapeo de texturas.
o Phone Bui-Toung - iluminación especular
1975
o Martin Newell - la famosa tetera que identifica la computación gráfica,
construida con curvas de Bezier.
o Benoit Mandelbrot - dimensión fractal/fraccional
1976
o James Blinn - método para simular reflexiones especulares sobre
objetos
1977
o Steve Wozniak - Apple II, computador personal con gráficos a color
1979
o
Roy Trubshaw
Phone y -Richard
Bui-Toung specularBartle - Dominios multi-usuario (MUD -
highlighting)
En los años 80 los dispositivos de salida incorporan los gráficos de ráster imágenes
de mapas de bit (bitmap) y el pixel. Los costos de los computadores personales
decrecen dramáticamente, el ratón y el trackball se convierten en los dispositivos
interactivos estándares.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
1982
o Steven Lisberger - "Tron", la primera película de Disney que hace
uso intensivo de los gráficos tridimensionales
o Tom Brighman - "Morphing" primera secuencia de película juega con
un carácter femenino que deforma y se transforma a sí misma en la
forma de un lince
o Jhon Walkner y Dan Drake – AutoCAD
1983
o Jaron Lanier - "DataGlove", una película de realidad virtual que usa
un guante instalado con interruptores y sensores para detectar el
movimiento de la mano.
1984
o Tech de Wavefron - Polhemus, primer software paras gráficos en 3D
1985
o Pixar Animation Studios. Cortometrajes “Luxo Jr.”- 1989 y “Tin toy”
o NES – Sistema de juegos casero Nintendo
1987
o IBM - VGA (Video Graphics Array) Se introdujo el arreglo de gráficos
1989 de video.
o Video Electronics Standards Association (VESA) – SVGA, Super VGA
En los años 90, desde la introducción del VGA y el SVGA, el computador personal
puede mostrar fácilmente imágenes fotorealistas y películas. La optimización de las
imágenes en 3D comienza su principal avance estimuladas por las aplicaciones
para gráficos usadas en el cine.
1990
o Hanrahan and Lawson - Renderman
1991
o Disney y Pixar - “Beauty and the Beast”, CGI fue ampliamente
utilizada, el sistema Renderman proporciona rapidez, precisión y alta
calidad a los efectos por computador.
1992
o Silicon Graphics - Especificación OpenGL
1993
o Universidad de Illinois - Mosaic. Primer navegador web gráfico.
o Steven Spielberg - “Jurassic Park” una exitosa película de ciencia
ficción a partir de efectos de computación gráfica.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
1995
o Buena Vista Pictures - “Toy Stroy” el primer largometraje
completamente generado en computador
o NVIDIA Corporation - GeForce 256 (GeForce3 (2001)
2003
o ID Software - Motor de gráficos Doom.
pulgada. Su unidad de medida son las muestras por pulgada (spi, samples per
inch). Cuantas más muestras por pulgada tenga una imagen escaneada, más
cercana estará la imagen digital a la imagen srcinal. Esta forma de medir la
resolución se utiliza poco, habiéndose adoptado como medida de calidad de una
imagen escaneada los píxeles por pulgada (ppp) que tiene la imagen digital
resultante del proceso.
Una forma común de clasificar las imágenes según su resolución es aquella que las
divide en imágenes de alta resolución (hi-res) e imágenes de baja resolución (low-
res). Una imagen de alta resolución está prevista para la impresión, teniendo
generalmente 300 ppp o más. Una imagen de baja resolución está prevista
solamente para su exhibición en pantalla, teniendo generalmente una resolución de
100 ppp o menos.
A mayor resolución, más píxeles hay en una imagen, más grande es su mapa de
bits, mayor información contiene y mayor capacidad de distinguir los detalles
espaciales finos, por lo que tendrá más definición, permitiendo un mayor detalle,
unas transiciones de color más sutiles y una mayor calidad de reproducción.
Las imágenes de mapas de bits dependen de la resolución a la que han sido
creadas, por lo que al modificar su tamaño pierden calidad visual. Si se disminuye,
los trazos finos perderán definición, desapareciendo partes de los mismos,
mientras que si se aumenta, la imagen se pixelará, al tener que cubrirse de forma
aproximada pixeles que inicialmente no existían, produciéndose el conocido efecto
de dientes de sierra.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Las imágenescomponentes,
sus vectores vectoriales sesualmacenan
posición y como una lista que describe cada uno de
sus propiedades.
En cuanto a la resolución, los gráficos vectoriales son independientes de la
resolución, ya que no dependen de una retícula de píxeles dada. Por lo tanto,
tienen la máxima resolución que permite el formato en que se almacena, no se
presentan inconvenientes con el efecto de pixelado ya que la descripción
matemática de un objeto es independiente del tamaño al cual se esté dibujando el
objeto.
Las entidades geométricas que forman parte de un gráfico vectorial son: el
segmento de recta, las circunferencias, las elipses, y los arcos de circunferencia.
Las trasformaciones típicas sobre las imágenes vectoriales son la traslación, la
rotación, el escalado y la cizalla. Estas transformaciones, puramente geométricas,
se muestran en la siguiente figura. Después de aplicarlas el objeto gráfico
conserva su precisión.
De esa manera,
[0..maxy], el espacio
con maxx, maxy de pantalla es un espacio discreto y acotado [0..maxx] *
N, el cual está en correspondencia con el espacio de
pueden tomar los puntos x,y en el espacio de pantalla, estos valores dependen de
la resolución del monitor.
La transformación de sistemas de coordenadas que es posible realizar en los
procesos de graficación en 2D y 3D se explicarán en las unidades didácticas
correspondientes.
Figura 13 Espectro con los 6 colores apreciados por Newton (violeta, azul, verde, amarillo, naranja y rojo)
Unos años más tarde, el físico inglés Thomas Young realizó el experimento a la
inversa. En primer lugar determinó por investigación que los seis colores del
espectro pueden quedar reducidos a tres colores básicos: el verde, el rojo y el azul
intenso. Tomó entonces tres linternas y proyectó tres haces de luz a través de
filtros de los colores mencionados, haciéndolos coincidir en un mismo espacio; los
haces verde, rojo y azul se convirtieron en luz blanca. En otras palabras, Young
recompuso la luz.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Así, la luz blanca, esa luz que rodea al ser humano, está formada por luz de seis
colores; y cuando incide en algún cuerpo éste absorbe alguno de dichos colores y
refleja otros. Esto da lugar al siguiente principio: Todos los cuerpos opacos, al ser
iluminados, reflejan todos o parte de los componentes de la luz que reciben.
En la práctica, y para comprender mejor este fenómeno, se dirá que, por ejemplo,
un tomate rojo absorbe el verde y el azul y refleja el rojo; y un plátano amarillo
absorbe el color azul y refleja los colores rojo y verde, los cuales, sumados,
permiten ver el color amarillo.
El color es una sensación subjetiva y nadie puede asegurar a ciencia cierta que
percibe los colores igual que otro. De todas formas los hombres vemos más o
menos igual y partiendo de esta premisa se deberá estudiar la teoría del color.
Aprender a ver el color y obtener una interpretación de sus propiedades inherentes
ha de ser el punto de partida si se desea realizar un tratamiento eficaz de éste en
las distintas aplicaciones gráficas que se construyen.
Los conos se concentran en una región cerca del centro de la retina llamada fóvea.
Su distribución sigue un ángulo de alrededor de 2° contados desde la fóvea. La
cantidad de conos es de 6 millones y algunos de ellos tienen una terminación
nerviosa que va al cerebro.
Los conos son los responsables de la visión del color y se cree que hay tres tipos
de conos, sensibles a los colores rojo, verde y azul, respectivamente. Dada su
forma de conexión a las terminaciones nerviosas que se dirigen al cerebro, son los
responsables de la definición espacial. También son poco sensibles a la intensidad
de la luz y proporcionan visión fotópica (visión a altos niveles).
Los bastones se concentran en zonas alejadas de la fóvea y son los responsables
de la visión escotópica (visión a bajos niveles). Los bastones comparten las
terminaciones nerviosas que se dirigen al cerebro, siendo por tanto su aportación a
la definición espacial poco importante. La cantidad de bastones se sitúa alrededor
de 100 millones y no son sensibles al color. Los bastones son mucho más
sensibles que los conos a la intensidad luminosa, por lo que aportan a la visión del
color aspectos como el brillo y el tono, y son los responsables de la visión nocturna.
Existen grupos de conos especializados en detectar y procesar un color
determinado, siendo diferente el total de ellos dedicados a un color y a otro. Por
ejemplo, existen más células especializadas en trabajar con las longitudes de onda
correspondientes al rojo que a ningún otro color, por lo que cuando el entorno en
que nos encontramos nos envía demasiado rojo se produce una saturación de
información en el cerebro de este color, srcinando una sensación de irritación en
las personas.
Cuando el sistema de conos y bastoncillos de una persona no es el correcto se
pueden producir una serie de irregularidades en la apreciación del color, al igual
que cuando las partes del cerebro encargadas de procesar estos datos están
dañadas. Esta es la explicación de fenómenos como la Daltonismo. Una persona
daltónica no aprecia las gamas de colores en su justa medida, confundiendo los
rojos con los verdes.
Debido a que el proceso de identificación de colores depende del cerebro y del
sistema ocular de cada persona en concreto, es posible medir con toda exactitud la
longitud de onda de un color determinado, pero el concepto del color producido por
ella es totalmente subjetivo, dependiendo de la persona en sí. Dos personas
diferentes pueden interpretar un color dado de forma diferente, y puede haber
tantas interpretaciones de un color como personas hay.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Los colores aditivos son los usados en trabajo gráfico con monitores de ordenador,
ya que el monitor produce los puntos de luz partiendo de tres tubos de rayos
catódicos, uno rojo, otro verde y otro azul. Por este motivo, el modelo de definición
de colores usado en trabajos digitales es el modelo RGB (Red, Green, Blue).
Todos los colores que se visualizan en el monitor están en función de las
cantidades de rojo, verde y azul utilizadas. Por ello, para representar un color en el
sistema RGB se le asigna un valor entre 0 y 255 (notación decimal) o entre 00 y FF
(notación hexadecimal) para cada uno de los componentes rojo, verde y azul que lo
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
forman. Los valores más altos de RGB corresponden a una cantidad mayor de luz
blanca. Por consiguiente, cuanto más altos son los valores RGB, más claros
son los colores.
De esta forma, un color cualquiera vendrá representado en el sistema RGB
mediante la sintaxis decimal (R,G,B) o mediante la sintaxis hexadecimal
#RRGGBB. El color rojo puro, por ejemplo, se especificará como (255,0,0) en
notación RGB decimal y #FF0000 en notación RGB hexadecimal, mientras que el
color rosa claro dado en notación decimal por (252,165,253) se corresponde con el
color hexadecimal #FCA5FD.
Esta forma aditiva de percibir el color no es única. Cuando la luz solar choca contra
la superficie de un objeto, éste absorbe diferentes longitudes de onda de su
espectro total, mientras que refleja otras. Estas longitudes de onda reflejadas son
precisamente las causantes de los colores de los objetos, colores que por ser
producidos por filtrado de longitudes de onda se denominan colores sustractivos.
Este fenómeno es el que se produce en pintura, donde el color final de una zona va
a depender de las longitudes de onda de la luz incidente reflejadas por los
pigmentos de color de la misma.
Un coche es de color azul porque absorbe todas las longitudes de onda que forman
la luz solar, excepto la correspondiente al color azul, que refleja, mientras que un
objeto es blanco porque refleja todo el espectro de ondas que forman la luz, es
decir, refleja todos los colores, y el resultado de la mezcla de todos ellos da como
resultado el blanco. Por su parte, un objeto es negro porque absorbe todas las
longitudes de onda del espectro: el negro es la ausencia de luz y de color.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
El matiz del color (Hue), también conocido como tono es el color en sí mismo,
supone su cualidad cromática, es -simplemente- un sinónimo de color. Es la
cualidad que define la mezcla de un color con blanco y negro. Está relacionado con
la longitud de onda de su radiación. Según su tonalidad se puede decir que un
color es rojo, amarillo, verde.
La saturación está relacionada con la pureza cromática o falta de dilución con el
blanco. Constituye la pureza del color respecto al gris, y depende de la cantidad de
blanco presente. Cuanto más saturado está un color, más puro es y menos mezcla
de gris posee.
Figura 20 Saturación
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
El brillo (Value) o brillantez tiene que ver con la intensidad o el nivel de energía. Es
la luminosidad de un color (la capacidad de reflejar el blanco. Alude a la claridad u
oscuridad de un tono. Es una condición variable, que puede alterar
fundamentalmente la apariencia de un color. La luminosidad puede variar
añadiendo negro o blanco a un tono.
limitada, sino porque los colores son definibles con poca precisión en algunos
casos. Si bien el ojo humano detecta aproximadamente 350.000 colores diferentes
(y es capaz de distinguir aproximadamente 50.000 en forma simultánea), esta
sensibilidad no es uniforme en todo el espacio cromático, sino que es mucho mayor
en ciertas áreas (por ejemplo en el eje naranja-violeta) y mucho menor en otras
(por ejemplo en el eje magenta-verde).
de la controladora de video.
colorear un pixel
colores más en función
cercanos del color en
disponibles reclamado por el
la paleta, modelo de iluminación,
probablemente por medioy los
de
interpolación. En capítulos posteriores estudiaremos como funcionan los modelos
de iluminación. Supongamos ahora que para un punto p de cada cara en la escena
se computan ecuaciones que determinan la componente del color para cada
primario RGB.
Cada pixel de cada cara reclamará un color determinado, es decir, una terna de
reales (R(p), G(p), B(p)). Esta terna debe transformarse a una terna (R,G,B) dentro
de la aritmética de la tarjeta gráfica. Al mismo tiempo, los valores de (R,G,B) deben
estar asociados a uno de los índices de color disponibles.
Una forma de diseñar paletas estáticas proviene de las siguientes consideraciones.
Normalmente
precisión de 6lasbittarjetas
en unarepresentan la intensidad
escala entera de 0 a de
63, cada primario
lo cual con256K
permite una
combinaciones de colores. De dichos 256K colores, es necesario elegir los 256
más representativos para un uso general. Más aún, deben ser elegidos de manera
tal que cualquier aplicación gráfica que reclama un color no existente en la paleta,
pueda encontrar rápidamente el índice de un color perteneciente a la paleta que
sea el más adecuado para remplazarlo. Es necesario, entonces, elegir un
subconjunto de las 64 intensidades permitidas para cada primario, de modo tal que
el producto de la cantidad de elementos en cada conjunto sea menor o igual que
256. En los modos gráficos de 64K colores (conocidos como hi-color), se utiliza una
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
sucede conde
sin pérdida lascalidad.
imágenes ráster, pueden ser escaladas a cualquier tamaño
Dispositivos de ráster. Los dispositivos de vectores fueron los primeros en
desarrollarse, pero luego del vertiginoso descenso en el costo de la memoria
volátil, a partir de la década del 70 se hicieron más baratos los dispositivos
de ráster. Esto implica un cambio en la manera de representar las primitivas
gráficas (usualmente dichas primitivas son el punto, el segmento de recta y
la circunferencia o el círculo). La representación ráster, como ya se explicó
en la sección anterior, también es denominada mapa de bits ("bit-map"),
consiste en sustituir los infinitos puntos de la imagen srcinal por un conjunto
finito de puntos, pixeles, tomados a intervalos regulares. Estos puntos
constituyen los nudos de una malla (generalmente las separaciones
horizontal ylos
representa vertical sonpuntos
infinitos iguales).
de laAimagen
partir de aquí,
real. el conjunto los
Posteriormente de pixeles
puntos
de color son reducidos a números para su almacenamiento y tratamiento en
el ordenador; el conjunto de valores numéricos adopta la forma de una
matriz a la que denominamos matriz-imagen. La forma en que un punto de
luz es reducido a un número varía según el método utilizado, este número, o
conjunto de números, debe indicar con precisión tanto el color (tono) como el
brillo (cuanta luz de dicho tono) y la saturación (pureza del color) de srcinal
correspondiente.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Plotters: Grafican en una hoja (que en algunos casos puede ser de gran tamaño)
sobre la cual se desliza una pluma movida por motores de pasos de gran precisión.
En los plotters de tambor, la pluma se
desliza en sentido horizontal y el papel en
sentido vertical. En los plotters planos (más
económicos), el papel está fijo y la pluma
realiza todos los movimientos. Son usuales
las resoluciones del orden de los 10000 *
10000. Es posible utilizar colores por medio
Figura 22 Plotter de varias plumas. Son ideales para la
graficación rápida y precisa de planos.
tanto, en determinadas
aplicaciones, como por ejemplo
animaciones, la prestación de un
mismo hardware aumenta en un Bus Local
orden de magnitud solamente al
modificar la configuración de CPU RAM
acceso. Figura 24 Tarjeta gráfica con tecnología de bus local
Figura 27 Dispositivos apuntadores indirectos: ratón, touchpad, trackpoint, joystick, tableta gráfica, etc.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Los ratones (mouse) suelen estar constituidos por una caja con una forma más o
menos anatómica en la que se encuentran dos botones que harán los famosos
clics de ratón siendo transmitidos por el cable al puerto PS/II o al puerto de serie.
Los ratones mecánicos mantienen dentro de esta caja una bola que sobresale de la
caja a la que se pegan 4 rodillos ortogonalmente dispuestos que serán los que
definan la dirección de movimiento del ratón. El ratón se mueve por una alfombrilla
ocasionando el movimiento de la bola que a su vez srcina el movimiento de uno o
varios de estos rodillos que se transforma en señales eléctricas y producen el
efecto de desplazamiento del ratón por la pantalla del ordenador.
Existen modelos en los que la transmisión se hace por infrarrojos eliminando por
tanto la necesidad de cableado. Otros presentan la bola en la parte superior de la
caja no estando por tanto en contacto con la alfombrilla y teniendo que ser movida
por los dedos del usuario aunque se srcina el mismo efecto. Otros utilizan diodos
emisores de luz (led), para capturar el movimiento del ratón, en este caso se
denominan ratones ópticos.
Los paquetes de animación consisten en uno o varios módulos con los que es
posible modelar, animar y dar apariencia real a un objeto. En un principio, las
empresas de animación programaban su propio software con el cual luego
trabajaban. Poco a poco fueron surgiendo distintos programas, los cuales podían
ser adquiridos a través de una licencia de uso.
El proceso de creación de gráficos 3D por computadora puede ser dividido en estas
tres fases básicas:
Modelado
Composición de la escena
Rénder (creación de la imagen final)
El modelado puede ser realizado por programas dedicados (como Lightwave 3D,
Rhinoceros 3D o Moray), un componente de una aplicación (Shaper, Lofter en 3D
Studio) o por un lenguaje de descripción de escenas (como en POV-Ray. En
algunos casos, no hay una distinción estricta entre estas fases; en dichos casos, el
modelado es sólo una parte del proceso de creación de escenas (por ejemplo, con
Caligari trueSpace).
Composición de la escena . Esta etapa involucra la distribución de objetos, luces,
cámaras y otras entidades en una escena que será utilizada para producir una
imagen estática o una animación. Si se utiliza para Animación, esta fase, en
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
general, hace uso de una técnica llamada "Keyframing" (cuadros clave), que facilita
la creación de movimientos complicados en la escena. Con la ayuda de la técnica
de keyframing, en lugar de tener que corregir la posición de un objeto, su rotación o
tamaño en cada cuadro de la animación, solo se necesita marcar algunos cuadros
clave (keyframes). Los cuadros entre keyframes son generados automáticamente,
lo que se conoce como 'Interpolación'.
esferas, conos, etcétera, en las denominadas mallas, que son redes de triángulos
interconectados.
Las mallas de triángulos son populares ya que está probado que son fáciles de
'renderizar' usando Scanline rendering.
Las representaciones poligonales no son utilizadas en todas las técnicas de rénder,
y en estos casos, el paso de tesselation no es incluido en la transición de
representación abstracta y la escena 'renderizada'.
Renderizado. Se llama rénder al proceso final de generar la imagen 2D o
animación a partir de la escena creada. Esto puede ser comparado a tomar una
foto o en el caso de la animación, a filmar una escena de la vida real.
Generalmente se buscan imágenes de calidad fotorrealista, y para este fin se han
desarrollado muchos métodos especiales. Las técnicas van desde las más
sencillas, como el rénder de alambre (wireframe rendering), pasando por el rénder
basado en polígonos, hasta las técnicas más modernas como el Scanline
Rendering, el Raytracing, la radiosidad o el Mapeado de fotones.
El software de rénder puede simular efectos cinematográficos como el lens flare, la
profundidad de campo, o el motion blur (desenfoque de movimiento). Estos
artefactos son, en realidad, un producto de las imperfecciones mecánicas de la
fotografía física, pero como el ojo humano está acostumbrado a su presencia, la
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Junto a estos paquetes mayores, hay otros que no se han ganado tal aceptación
general, pero que no son simples juguetes. Algunos son:
computadora.
hardware paraEstas APIs han
gráficos por demostrado ser vitales
computadora, ya quepara los desarrolladores
proveen un camino de al
programador para acceder al hardware de manera abstracta, aprovechando las
ventajas de tal o cual tarjeta de video.
Las siguientes APIs para gráficos por computadora son particularmente populares:
OpenGL
Direct3D (subconjunto de DirectX para producir gráficos interactivos en 3D)
RenderMan
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
http://www.lilliputmodel.com/articulos/cebrian/teoria_color1.htm.
Mayo de 2005. Fecha de consulta:
rectas, círculos,
llenado de áreas ypolígonos, para posteriormente abordar lo correspondiente a
transformaciones.
Para ello se parte de la conceptualización matemática de cada una de estas
primitivas, llegando al proceso de discretización necesario para su dibujo en un
dispositivo como el monitor. Aunque muchos de los lenguajes computacionales ya
tienen definidas en sus librerías gráficas funciones que permiten dibujar estas
primitivas sin tener que incluirse en el problema de la discretización, la idea
fundamental es conocer ¿cómo funciona el dibujado en el monitor, a partir de su
unidad básica: el píxel? Se espera que este conocimiento redunde en un mejor
manejo de los algoritmos que describen este proceso.
En cada uno de los algoritmos básicos se proporciona la codificación en lenguaje
Java con el fin de acercarlo a la programación. En la próxima unidad se mostrará
con un mayor nivel de detalle las posibilidades de un API para la graficación. Aquí
dará sus primeros pasos....pero serán esenciales.
Intencionalidades Formativas
Propósitos
Introducir al estudiante en el conocimiento de los principales algoritmos y
estructuras de datos utilizados en Computación Gráfica para modelar y
visualizar escenas en 2 y 3 dimensiones, como fundamento para la
visualización gráfica en el computador.
Proporcionar al estudiante los lineamientos tecnológicos básicos que le
permitan utilizar librerías gráficas (Ej. OpenGL) en conjunto con lenguajes de
programación estructurada como JAVA.
Objetivos
Conocer los algoritmos necesarios para el trazado de curvas en dos
dimensiones, a partir del estudio de su srcen matemático, geométrico y la
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Competencias
El estudiante programa empleando algoritmos que permiten dibujar las
principales figuras geométricas en dos dimensiones.
El estudiante conoce los fundamentos matemáticos de la representación de
gráficos computacionales en tres dimensiones y utiliza los algoritmos que las
realizan.
Metas
Al finalizar esta unidad didáctica el estudiante estará en capacidad de:
Productos de Aprendizaje
Individual
Lectura autorregulada de la Unidad Didáctica realizando fichas textuales y
mapas conceptuales para archivar en el portafolio.
Consultar en internet sobre los temas de la unidad y publicar preguntas en el
o
Debe
No iniciar
puede con una
emplear letra, elreservadas
palabras carácter subrayado (_) o por
(ej. utilizadas signo peso ($).
el lenguaje).
o No puede contener espacios en blanco.
o Puede contener pero no iniciar por números.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
char Caracteres
mismos queUnicode de con
los ASCII 16 el
bitsbit Los caracteres
alto puesto a 0.alfa-numéricos
Valores desde son los
0 hasta
65535 (valores de 16-bits sin signo).
short Tamaño 16 bits. Valores desde -215 hasta 215-1 (-32768 a 32767)
18.2. Caracteres
En Java los caracteres no están limitados a los presentes en la tabla ASCII, son
Unicode. Un caracter se presenta siempre entre comillas simples ej. 'A', '5', 'ó', etc.
El tipo de dato char se emplea para almacenar estos caracteres.
Un tipo especial de caracteres comprenden la secuencia de escape, empleados
para representar caracteres de control o caracteres que no se imprimen. Una
secuencia de escape está formada por la barra invertida (\) y un caracter. La
siguiente tabla presenta las secuencias de escape más utilizadas.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
\r Retorno de carro (hace que se mueva el cursor a la primera posición de una línea)
18.3 Variables
booleanas Una variable booleana solamente puede guardar uno de los
dos posibles valores: true (verdadero) y false (falso). Ej.
boolean var1 = true;
en coma flotante Las variables del tipo float o double (coma flotante) se
emplean para almacenar valores que poseen parte entera y
parte decimal. Ej.float var1 = 4.3f; double var1 = 3.5;
Netbeans: NetBeans es un proyecto de código abierto de gran éxito con una gran
base de usuarios, una comunidad en constante crecimiento, y con cerca de 100
socios en todo el mundo. Sun MicroSystems fundó el proyecto de código abierto
NetBeans en junio de 2000 y continúa siendo el patrocinador principal de los
proyectos.
La plataforma NetBeans permite que las aplicaciones sean desarrolladas a partir de
un conjunto de componentes de software llamados módulos. Un módulo es un
archivo Java que contiene clases de java escritas para interactuar con las APIs de
NetBeans y un archivo especial (manifest file) que lo identifica como módulo. Las
aplicaciones construidas a partir de módulos pueden ser extendidas agregándole
nuevos módulos. Debido a que los módulos pueden ser desarrollados
independientemente, las aplicaciones basadas en la plataforma NetBeans pueden
ser extendidas fácilmente por otros desarrolladores de software.
Modularidad. Todas las funciones del IDE son provistas por módulos. Cada módulo
provee una función bien definida, tales como el soporte de Java, edición, o soporte
para el sistema de control de versiones. NetBeans contiene todos los módulos
necesarios para el desarrollo de aplicaciones Java en una sola descarga,
permitiéndole al usuario comenzar a trabajar inmediatamente.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
interfaz de depuración
Editor con resaltado de sintaxis
Asistentes
Interfaz de usuario totalmente personalizable
Con JCreator es posible compilar o ejecutar directamente el programa Java sin
necesidad de activar el documento principal. JCreator identifica automáticamente el
archivo con el método principal o el archivo html cargador del applet de Java.
Para el desarrollo de las actividades prácticas del presente curso se recomienda el
empleo de JCreator (versión LE).
Para realizar la instalación del JCreator es necesario descargarlo desde la página
http://www.jcreator.org/download.htm, allí deberá seleccionar el instalador
correspondiente a su sistema operativo y hacer clic en el enlace de descarga.
20.1 Compilación
Al emplear la herramienta de compilación, JCreator hace el llamado al compilador
de JAVA ejecutando el programa javac.exe.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
20.2 Ejecución
Una vez compilado el programa en JAVA, se genera un nuevo archivo en el
directorio srcinal con la extensión .class, el cual puede ser interpretado ejecutando
el programa java.exe.
Evaluar su ecuación
DDA (discrete diferencediferencial
analyzer) a diferencias
consiste : Este
finitasla
en plantear método,
ecuación denominado
diferencial de la
primitiva a discretizar, y luego evaluar dicha expresión a intervalos adecuados.
Análisis del error: Estos métodos fueron desarrollados por Bressenham y se
basan en analizar, dado un pixel que pertenece a la discretización de la primitiva,
cuál es el próximo pixel que minimiza una determinada expresión que evalúa el
error que comete la discretización.
x y.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
antalla sombreado en la
Esto equivale a trabajar en el “octavo” del espacio de p
Figura 38, donde el srcen es el pixel que corresponde a la discretización del punto
(x0;y0) y la zona sombreada a los lugares donde puede ubicarse el punto (x1;y1 ).
mismo pixel. Por el contrario, un valor muy grande determinaría que el segmento
aparezca “punteado” en vez de ser continuo como corresponde. Un valor práctico
es elegir x = 1 y por lo tanto n = x, es decir, la discretización tiene tantos pixeles
como longitud tiene el segmento en la variable que más varía (más uno, dado que
la secuencia tiene n + 1 puntos). Al mismo tiempo es fácil ver que
3. Java no tiene una sentencia básica para dibujar puntos (pixeles), en este
caso se utiliza la sentencia g.drawRect (línea 35) para dibujar un rectángulo
con un ancho y alto de 0, que en su ejecución se traduce a pintar un único
pixel ubicado en el punto enviado como parámetro.
4. En la misma sentencia g.drawRect (línea 35) se utiliza el “casting” a enteros
para lograr la discretización de las coordenadas flotantes.
centro del pixel elegido y el segmento de recta, medida en dirección del eje Y
positivo del espacio de pantalla (es decir, hacia abajo). Si el error en p fuese cero,
entonces al ir hacia E el error pasa a ser m (la pendiente del segmento), y en D el
error pasa a ser m - 1 (ver Figura 44).
Paso a E : e = e + m
Paso a D : e = e + m –1
Por lo tanto, la elección del paso E o D depende de que el valor absoluto de e+m
sea o no menor que el valor absoluto de e+m-1. Expresado de otra manera, sea e
el error en un determinado pixel. Si e +m> 0.5 entonces el segmento de recta pasa
más cerca del pixel D, y si no, pasa más cerca del pixel E (ver Figura 45).
Una de las economías de cómputo del método proviene de poder evaluar el error
preguntando por cero. Es fácil ver que si se inicializa el error en e = m – 0.5
entonces en cada paso hay que chequear e >0 para elegir D. La otra economía
proviene de realizar manipulaciones algebraicas para efectuar un cómputo
equivalente pero en aritmética entera. Como se evalúa el error por cero, multiplicar
el error por una constante no afecta el resultado. Por lo tanto, multiplicamos el error
por 2x. A partir de dicho cambio, se constatan las siguientes igualdades:
y
e0 2x 0.5 2y x
x
Paso a E : e = e+2 y
Paso a D: e = e+2( y-x)
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
y r * sen
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Estas ecuaciones serán las que ocuparemos para calcular cada punto (x,y) del
círculo, donde el r será obviamente el radio de círculo y será el ángulo que forma
el radio con la parte positiva del eje x. En forma gráfica sería así:
El ángulo deberá estar en radianes ya que las funciones de seno y coseno que
incluye Java, trabajan con los ángulos en radianes. La fórmula para transformar
grados a radianes es la siguiente:
gra dos *
radianes 180
círculopunto
cada puntoelaseno
puntoy el
escoseno
una tarea
delun poco lenta,
ángulo, y estasdebido a queson
funcionas se muy
debelentas.
calcular en
Para
solucionar esto se pueden crear tablas predefinidas o pre-calculadas. En la
siguiente figura se muestra el código en Java que permitiría dibujar el círculo en
una ventana.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Cabe
en C, recordar
el índice que en vectores
de los Java, al igual
iniciaque
en
0. Por tanto, la primera línea se dibuja
desde el primer punto (índice 0) hasta el
segundo punto (índice 1), continúa del
segundo al tercero (índice 2) y así
sucesivamente, hasta dibujar la línea
del penúltimo punto (índice N-2) hasta
el último punto del vector (índice N-1).
Al finalizar el ciclo, dibuja la línea de
cierre del polígono entre el último punto
Figura 51 Resultado de la ejecución del (índice N-1) y el primero (índice 0).
algoritmo de dibujo de Polígonos
Como se podrá deducir del código el objeto Punto incluye las coordenadas x e y de
un punto en el plano cartesiano.
x i = cx + r * cos( i* α )
y i = cy + r * sen( i* α )
donde:
i = 0,1,2,...,N-1,
r es el radio de la circunferencia, y
c = (cx, cy) es la coordenada del centro geométrico de la circunferencia y del
polígono.
Al agregar el centro a nuestra fórmula, conseguimos mover el centro geométrico
del srcen (0,0) al que nosotros deseemos. En la Figura 52 se muestra el código
que generaría los polígonos regulares.
CAPÍTULO 6 Transformaciones
Naturalmente, así como se desean dibujar gráficos, también se desea moverlos,
rotarlos, cambiar su tamaño, etc. En esta sección se presentan los principales
fundamentos matemáticos que subyacen al proceso de transformación de los
gráficos en dos dimensiones, a partir de lo mostrado por el euitmt WWW team de la
Universidad de Oviedo. Se espera que el estudiante en su proceso de
profundización realice los algoritmos que permitan hacer estas transformaciones.
Una de las mayores virtudes de los gráficos generados por ordenador es la
facilidad con se pueden realizar algunas modificaciones sobre las imágenes. Un
gerente puede cambiar la escala de las gráficas de un informe. Un arquitecto puede
ver un edificio desde distintos puntos de vista. Un cartógrafo puede cambiar la
escala de un mapa. Un animador puede modificar la posición de un personaje.
Estos cambios son fáciles de realizar porque la imagen gráfica ha sido codificada
en forma de números y almacenada en el interior del ordenador. Los números son
susceptibles a las operaciones matemáticas denominadas transformaciones.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
De forma matemática A = AI
Por tanto, la matriz T es una aplicación entre el punto srcinal P1 y el nuevo punto
P2. Si suponemos la imagen compuesta por los vértices de un polígono. ¿Qué
pasará si transformamos cada uno de los puntos mediante una multiplicación por
una matriz T y dibujamos el resultado? ¿Qué aspecto tendrá esta nueva imagen?
La respuesta, por supuesto, depende de los elementos de la matriz T. Si, por
ejemplo, escogemos la matriz identidad entonces la imagen no se verá alterada.
Sin embargo, si escogemos la matriz
entonces
Cada una de las nuevas coordenadas x tiene el doble de valor que las antiguas.
Las líneas horizontales serán dos veces más largas en la nueva imagen. La nueva
imagen tendrá la misma altura, pero parecerá que la hemos estirado hasta alcanzar
el doble del ancho srcinal.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Lección 28 Rotación
La siguiente transformación gráfica que vamos a ver es la rotación. Para introducir
esta transformación recordaremos brevemente algunos conceptos trigonométricos.
Sea un punto p1=(x1, y1) y lo giramos alrededor del srcen un ángulo para pasar
a una nueva posición p2=(x2, y2). Queremos encontrar la transformación que
convierte (x1, y1) en (x2, y2). Pero, antes de comprobar si alguna transformación
es la adecuada, debemos saber primero que (x2, y2) debe escribirse en función de
(x1, y1) y . Para esto es necesario recordar las razones trigonométricas de seno y
coseno.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
De forma análoga:
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Dando
A la vista de estas ecuaciones podemos imaginar una matriz que relacione las
coordenadas del punto srcinal y del punto girado:
Así la matriz de transformación para una rotación en sentido contrario a las agujas
del reloj de ángulo alrededor del srcen es
Para una rotación en el sentido de las agujas del reloj, basta sustituir en la
expresión anterior el valor del ángulo por - . Así nos queda
se convierte en
Si aplicamos esta matriz a un punto (xw, yw, w) obtenemos
Si dividimos
cambiado deahora por el tercer valor w tenemos (Exx, Eyy) que es el punto correcto
escala.
La rotación es
Cabe destacar que esta matriz se puede formar también mediante una rotación
inicial de ángulo y una traslación definida por los valores contenidos en la tercera
fila.
-1 0
0 1
Reflexión respecto al eje y
1 0
0 -1
Reflexión respecto al eje x
-1 0
0 -1
Reflexión respecto al srcen
0 1
1 0
Reflexión respecto a la recta y=x
0 -1
-1 0
Reflexión respecto a la recta y=-x
1 a
0 1
Deformación en el eje y
1 0
b 1
Deformación en el eje x
Las primeras tres reflexiones son simples cambios de escala pero con factores
negativos. Las simetrías respecto a las rectas y=x e y=-x pueden realizarse
mediante un cambio de escale y un giro posterior. Es posible realizar las
deformaciones mediante una secuencia de rotaciones y cambios de escala, aunque
es mucho más fácil aplicar la matriz resultante. De igual forma se pueden construir
transformaciones de cambio de escala y rotación a partir de las deformaciones.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
http://graficos.conclase.net/curso/index.php
Fecha de consulta: Diciembre de 2005. steven@conclase.net
DELRIEUX, Claudio. Introducción a la computación gráfica. [En línea]
http://www.dc.uba.ar/people/materias/cgr/util.htm. Universidad Nacional del Sur.
Departamento de Ingeniería eléctrica. Claudio@acm.org.
EUITMT WWW TEAM. Dibujo asistido por ordenador. Transformaciones 2 y 3 D.
[En línea] http://www.mieres.uniovi.es/egi/dao/apuntes/. Universidad de Oviedo.
Campus Mieres. Fecha de consulta: Octubre de 2005. Última modificación: 9 de
Julio de 1999 - 13:36:26
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
esta Unidad en
mencionaba deseamos
la primera introducir
unidad lasel manejo de una
API gráficas API gráfico.
proporcionan Como de
un conjunto se
primitivas independientes del hardware que le facilitan el proceso de dibujo
computacional, algunas de ellas, como OpenGL son muy utilizadas por dos
razones: su potencial y la libre distribución.
El lenguaje de programación Java proporciona como parte de su conjunto de
clases fundamentales para la creación de interfaces gráficas de usuario, un
conjunto de clases denominado Java 2D.
El API 2D de Java introducido en el JDK 1.2 proporciona gráficos avanzados en
dos dimensiones, texto, y capacidades de manejo de imágenes para los programas
Java a través de la extensión del AWT. Este paquete de dibujo soporta líneas
artísticas, texto e imágenes en un marco de trabajo flexible y lleno de potencia para
desarrollar interfaces de usuario, programas de dibujo sofisticados y editores de
imágenes.
El API 2D de Java proporciona:
La implementación
anticipación de buena parte
los fundamentos de los
básicos de ejemplos requiere
la clase Awt que usted
o Swing conozca
de Java, con
si quiere
repasarlos, revise la sección de enlaces.
Intencionalidades Formativas
Propósitos
Introducir al estudiante en el conocimiento de los principales algoritmos y
estructuras de datos utilizados en Computación Gráfica, especialmente en la
generación de gráficos en dos dimensiones.
Proporcionar al API
permitan utilizar estudiante
gráficas los lineamientos
en conjunto tecnológicos
con lenguajes básicos que de
de programación le
alto nivel, para el proceso de modelamiento y construcción de escenarios
gráficos en 2D y 3D.
Objetivos
Programar ejercicios de llenado de áreas y transformaciones de figuras en
dos dimensiones, utilizando librerías gráficas y lenguajes de programación,
partiendo de la conceptualización geométrica respectiva.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Productos de Aprendizaje
Individual
Lectura autorregulada de la Unidad Didáctica realizando fichas textuales y
mapas conceptuales para archivar en el portafolio.
Consultar en internet sobre los temas de la unidad y publicar preguntas en el
setFont
setRenderingHints
Cuando se configura un atributo, se el pasa al objeto el atributo apropiado. Por
ejemplo, para cambiar el atributo paint a un relleno de gradiente azul-gris,
deberíamos construir el objeto GradientPaint y luego llamar a setPaint.
gp = new GradientPaint(0f,0f,blue,0f,30f,green);
g2.setPaint(gp);
Aunque el sistema de coordenadas para una ventana o una pantalla podría ser
muy distinto que para una impresora, estas diferencias son invisibles para los
programas Java. Las conversiones necesarias entre el espacio de usuario y el
espacio de dispositivo se realizan automáticamente durante el dibujado.
Espacio de usuario
Como se muestra en la Figura 55, el srcen del espacio de usuario se localiza en la
esquina superior izquierda del espacio, con los valores de x incrementando a la
derecha y los valores de y incrementando hacia abajo.
El espacio del usuario representa una abstracción uniforme de todas los posibles
sistemas de coordenadas de dispositivos. El espacio de dispositivo para un
dispositivo particular podría tener el mismo srcen y dirección del espacio del
usuario, o podrían ser diferentes. Sin embargo, las coordenadas del espacio del
usuario son automáticamente transformadas en las apropiadas para el espacio del
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Espacio de dispositivo
El API 2D de Java define tres niveles de información de configuración que se
mantienen para permitir la conversión desde un espacio de usuario a un espacio de
dispositivo. Esta información está encapsulada en tres clases:
GraphicsEnvironment
GraphicsDevice
GraphicsConfiguration
Entre ellas, representan toda la información necesaria para localizar un dispositivo
de renderizado o fuente en la plataforma Java y para convertir las coordenadas del
espacio de usuario al espacio de dispositivo. Una aplicación puede tener acceso a
esta información, pero no necesita desarrollar modificaciones en ellas.
El GraphicsEnvironment describe la colección de dispositivos de renderizado
disponible para una aplicación Java en un plataforma particular. Los dispositivos
de renderizado incluyen pantallas, impresoras y búferes de imagen. El
GraphicsEnvironment también incluye una lista de todas las fuentes disponibles en
una plataforma.
El GraphicsDevice describe un dispositivo de renderizado visible para la aplicación,
tal como una pantalla o impresora. Cada configuración posible de el dispositivo se
representa por una GraphicsConfiguration. Por ejemplo, un dispositivo de
visualización SVGA puede operara en varios modos: 640*480*16 colores,
640*480*256 colores y 800*600*256 colores. La pantalla SVGA está representada
por un objeto GraphicsDevice y cada uno de los modos es representado por un
objeto GraphicsConfiguration.
Un GraphicsEnvironment puede contener uno o más GraphicsDevice, a su vez,
cada GraphicsDevice puede tener una o más GraphicsConfiguration.
Transformaciones
El API Java 2D ha unificado su modelo de transformación de coordenadas. Todas
las transformaciones de coordenadas, incluyendo transformaciones desde el
espacio del usuario al espacio del dispositivo, son representadas por objetos de la
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
clase AffineTransform, que define las reglas para manipular coordenadas usando
matrices.
Es posible adicionar un AffineTransform al contexto gráfico para rotar, escalar,
trasladar o recortar una figura geométrica, texto o imagen cuando se esta
renderizando. La transformación adicional se aplica a cualquier objeto gráfico
renderizado en ese contexto. La transformación se realiza cuando el espacio de
coordenadas de usuario se convierte en espacio de coordenadas del dispositivo.
32.2 Fuentes
Una cadena se asume de manera normal, en términos de los caracteres que la
conforman. Cuando se dibuja una cadena, su apariencia está determinada por la
letra o fuente que está seleccionada. Sin embargo, las figuras que la fuente usa
para mostrar la cadena no siempre corresponden con caracteres individuales, por
ejemplo, en publicidad profesional, ciertas combinaciones de dos o más caracteres
se reemplazan a menudo por una figura simple denominada ligature.
Las figuras que una fuente usa para representar los caracteres en las cadenas se
denominan Glyphs. Una fuente puede representar un carácter como una a con
tílde usando varios glyphs, o representar ciertas combinaciones de caracteres
como la fi de final con un único glyph. En el API Java 2D, una glyph es
simplemente un Shape que puede ser manipulado y dibujado en la misma forma
que cualquier otro objeto Shape.
Una fuente puede ser entendida como una colección glyphs. Una única fuente
puede tener muchas versiones, tales como heavy, médium, oblique, ghotic y
regular. Estas diferentes versiones son llamadas caras (faces). Todas las caras de
una fuente tienen un diseño tipográfico similar y pueden ser reconocidas como
miembros de una misma familia. En otras palabras, una colección de glyphs con
una forma particular de estilo conforma una font face, una colección de formas de
font faces forman una font family, y una colección de font families conforma el
grupo de fuentes disponible en un GraphicsEnvironment particular.
En el API Java 2D, las fuentes se especifican por un nombre que describe una
particular font face (por ejemplo: Helvetica Bold) Es diferente a como se asume en
el JDK 1.1, en las que las fuentes eran descritas por nombres lógicos que tomaban
la forma de diferentes font face dependiendo de las fuentes disponibles en la
plataforma particular. Para lograr compatibilidad el API Java 2D soporta la
especificación de fuentes por su nombre lógico y también por su nombre de font
face.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
32.3 Imágenes
Las imágenes son colecciones de píxeles organizados espacialmente. Un píxel
define la apariencia de una imagen en una ubicación simple. Un arreglo
bidimensional de píxeles se denomina una ráster.
La apariencia del píxel puede definirse directamente o como un índice en una tabla
de color para una imagen. En imágenes que contienen muchos colores (más de
256), los píxeles usualmente representan directamente el color, alpha y otras
características de cada localización de la pantalla. Tales imágenes tienden a ser
muchos más grandes que las imágenes de color indexado (indexed-color
images), pero ellas son más realistas.
En una imagen de color indexado, los colores en la imagen están limitados a los
colores especificados en una tabla de colores, a menudo, el resultado es que sólo
es posible usar unos pocos colores en la imagen. Sin embargo, un índice requiere
menos almacenamiento que un valor de color, por tanto el resultado es que las
imágenes de colores indexados son más pequeñas. El formato de píxel es popular
para las imágenes que contienen sólo 16 o 256 colores.
Las imágenes en el API 2D de java tiene dos componentes primarios:
Los datos de la imagen srcinal (los píxeles)
La información necesaria para interpretar los píxeles.
Las reglas para interpretar los píxeles están encapsuladas en un objeto
ColorModel (por ejemplo, los valores podrían ser interpretados de dos formas,
como colores directos o indexados). Para que un píxel pueda ser mostrado, debe
estar relacionado con un modelo de color.
Una banda o canal ( band) es un componente del espacio de color de una imagen.
Por ejemplo, el Rojo (Red), Verde (Green)y Azul (Blue) son las bandas o canales
de una imagen RGB. Un píxel en una imagen de modelo de color directo puede
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Una objetodeColorSpace
conjunto encapsula las
valores numéricos reglas que gobiernan
corresponden la forma
a un color como un
particular. La
implementación del ColorSpace en el java.awt.color representa los espacios de
color más popular, incluyendo RGB y escala de grises. Es importante aclarar que
un espacio de color no es una colección de colores, el define las reglas como
deberán ser interpretados los valores de colores individuales.
Al separar el espacio de color (ColorSpace) del modelo de color (ColorModel) se
proporciona mayor flexibilidad para representar y convertir de una representación
de color a otra.
Los patrones de rellenos están definidos por objetos que implementan la interfaz
Paint. La clase Color, que está disponible en versiones anteriores de AWT, es un
tipo simple de un objeto Saint usado para definir rellenos de colores sólidos. El API
2D de Java proporciona dos implementaciones adicionales para Paint,
TexturePaint y GradientPaint.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
En Java 2D, el renderizado de la línea exterior y el relleno de una figura son dos
operaciones separadas:
Usando el método draw se dibuja el contorno (línea exterior) de la figura usando el
estilo de lápiz especificado en el atributo Stroke y el patrón de relleno especificado
por el atributo Paint.
Usado el método fill se rellena el interior de la figura con el patrón especificado en
el atributo Paint.
Cuando se renderiza una cadena de texto, el atributo actual de Paint se aplica a los
glyphs que forman la cadena. Sin embargo, drawString actualmente rellena los
glyphs que están siendo renderizados. Para modificar el filete del contorno de los
glyphs en una cadena de texto, es necesario enviar el contorno y renderizarlos
como figuras usando el método draw.
java.awt.image java.awt.image.renderable
java.awt.print
El paquete java.awt contiene algunas clases e interfaces del API Java 2D,
obviamente no todas las clases del java.awt son clases del Java 2D.
AlphaComposite BasicStroke Color
Composite CompositeContext Font
GradientPaint Graphics2D GraphicsConfiguration
GraphicsDevice GraphicsEnvironment Paint
PaintContext Rectangle Shape
Stroke TexturePaint Transparency
El API Java 2D mejora las siguientes clases heredadas de la clase image de AWT
ColorModel
DirectColorModel
IndexColorModel
Estas clases de modelo de color recogen las características del java.awt.image
para compatibilidad, y para mantener consistencia, las nuevas clases del modelo
de color también están localizadas en el paquete java.awt.image.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
PrinterJob
Antes de comenzar en serio con los componentes gráficos que proporciona el API
2D de java, es necesario, hacer una pequeña revisión de la clase Graphics,
superclase de Graphics2D y revisar algunos conceptos básicos acerca del contexto
gráfico, que posteriormente permitirán comprender mucho mejor los ejemplos que
se presentarán.
múltiples
intentado métodos, intentando
aquí, aunque agruparlos
si el lector porreferencia
quiere una funcionalidad, que yes
completa lo descripción
una que se ha
de los métodos de esta clase deberá recurrir a la documentación que JavaSoft
proporciona sobre el AWT.
Hay que empezar hablando del constructor de la clase Graphics, que no tiene
argumentos; aunque Graphics es una clase abstracta, por lo que las aplicaciones
no pueden llamar a este constructor directamente. Se puede obtener un objeto de
tipo Graphics a partir de otro objeto Graphics llamando al método getGraphics()
sobre un componente. También se puede recibir un objeto Graphics como
parámetro cuando se van a sobreescribir los métodos paint() o update().
translate( int,int ), en
los dos parámetros traslada el srcen
el sistema del contexto que
de coordenadas gráfico al punto
se esté que se pasa en
utilizando.
superficie
del cual sede dibujo,manipular
pueden luego esetodas
objeto
lasGraphics define
actividades un contexto
gráficas gráfico
sobre esa a través
superficie. Y
otros autores indican que un objeto Graphics es la superficie última sobre la que se
pueden colocar líneas, figuras y texto, por lo cual puede recibir también el nombre
de contexto gráfico al aunar información sobre la zona de dibujo, más la fuente de
caracteres, color y cualquier otro factor.
Ahora que ya se sabe lo que es un contexto gráfico, hay que ver cómo se consigue
crear uno. Para empezar, esto no puede hacerse instanciando directamente un
objeto de tipo Graphics, ya que la clase Graphics es abstracta y no puede ser
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
instanciada por el código de la aplicación, así que hay que recurrir a formas
indirectas para conseguir el contexto gráfico.
Uno de estos caminos indirectos para obtener un contexto gráfico es invocar el
método getGraphics() sobre otro objeto. Sin embargo, este método devuelve un
contexto gráfico de una imagen, es decir, que solamente funciona para objetos de
tipo Image creados en memoria a través del método createImage(), de la clase
Component. Esta es una técnica utilizada normalmente cuando se están usando
imágenes que se crean en memoria y luego se transfieren a la pantalla, es decir, se
está pintando en el doble buffer.
Hay otros dos caminos para obtener un contexto gráfico y, son sorprendentemente
simples, porque se hace automáticamente, y es cuando se sobreescriben los
métodos paint() y update(), en los cuales Java pasa como parámetro el contexto
gráfico del objeto al que pertenece el método.
Normalmente, el método paint() se sobreescribe cuando se quiere colocar algún
tipo de material gráfico sobre la pantalla, y el método update() se sobreescribe en
circunstancias especiales, como puede ser el caso de una animación o que se vaya
a utilizar doble buffer. Lo normal es pues la presentación de información gráfica
colocando el código encargado de ello en el método sobreescrito paint() y luego
invocando al método repaint() para indicar al sistema que presente ese material en
pantalla; aunque el método paint() también puede ser invocado por causas
externas, sin control alguno por parte de la aplicación, como puede ser el
redimensionamiento de la ventana en la que se está presentando la información
gráfica.
Hay que tener en cuenta que el método repaint() pide al sistema que redibuje el
componente tan pronto como sea posible, pero esto lo hará el método update() que
se llame a continuación. No hay una relación uno a uno entre las llamadas a
repaint() y update(), por lo que es posible que múltiples llamadas a repaint() puedan
recogerse en una sola llamada a update().
El método update() es invocado automáticamente cuando se pide repintar un
Componente. Si el componente no es ligero (lightweight), la implementación por
defecto de update() borra el contexto gráfico rellenando el fondo en el color que se
haya asignado como color de fondo, fijando de nuevo el color al color del primer
plano y llamando a paint(). Si no se sobreescribe update() para hacer una
animación, se verá siempre un parpadeo en el refresco del componente por causa
de este borrado del fondo.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
En síntesis, el método paint() es el que ofrece el sistema para poder pintar lo que
se quiera sobre un determinado componente. En la clase base Component, este
método no hace absolutamente nada. Normalmente, en el caso de applets, se
sobreescribe para hacer presentar un rectángulo relleno con el color de fondo.
Veamos un primer ejemplo básico de obtención del contexto gráfico y pintado de
una cadena de texto en un objeto Frame en la Figura 58. Notará que se utiliza la
clase Frame del AWT y no la JFrame del Swing, ya que se quieren asegurar la
compatibilidad.
36.2 GeneralPath
La clase GeneralPath permite crear una curva arbitraria especificando una serie de
posiciones a lo largo de los límites d e la forma.
Estas posiciones pueden ser conectadas por
segmentos de línea, curvas cuadráticas o curvas
cúbicas.
Esta figura puede ser creada con 3 segmentos de
Figura 60 Forma GeneralPath línea y una curva cúbica.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
*/
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
/*
* La clase se crea como hija de la clase Applet. Si se define como hija
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
setForeground(fg);
}
int xSpace) {
boolean fontFits = false;
Font font = g2.getFont();
FontMetrics fontMetrics = g2.getFontMetrics();
int size = font.getSize();
String name = font.getName();
while ( !fontFits ) {
if ( (fontMetrics.getHeight() <= maxCharHeight)
&& (fontMetrics.stringWidth(longString) <= xSpace) ) {
fontFits = true;
}
else {
if ( size <= minFontSize ) {
fontFits = true;
}
else {
g2.setFont(font = new Font(name,
style,
--size));
fontMetrics = g2.getFontMetrics();
}
}
}
return fontMetrics;
}
/* Toma las dimensiones del contexto y lo divide para saber el ancho y alto de
* cada una de las celdas de la cuadrícula donde dibujará
*/
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Dimension d = getSize();
int gridWidth = d.width / 6;
int gridHeight = d.height / 2;
int x = 5;
int y = 7;
int rectWidth = gridWidth - 2*x;
int stringY = gridHeight - 3 - fontMetrics.getDescent();
int rectHeight = stringY - fontMetrics.getMaxAscent() - y - 2;
g2.setStroke(stroke);
g2.draw(new Rectangle2D.Double(x+5, y+5, rectWidth-5, rectHeight-5));
g2.drawString("Rectangle 2D", x, stringY);
x += gridWidth;
*/
g2.setStroke(dashed);
g2.draw(new RoundRectangle2D.Double(x+20, y+20, rectWidth-40,
rectHeight-40, 40, 40));
g2.drawString("RoundRectangle2D", x, stringY);
x += gridWidth;
g2.drawString("Arc2D", x, stringY);
x += gridWidth;
/* Asigna el filete, crea unos vectores con las coordenadas de los puntos del polígono,
* crea el objeto GeneralPath (polygon) trazando lineas entre las coordenadas
* y finalmente cierra el poligono. Dibuja el polígono y el texto inferior
* correspondiente.
*/
g2.setStroke(stroke);
int x1Points[] = {x, x+rectWidth, x, x+rectWidth};
int y1Points[] = {y, y+rectHeight, y+rectHeight, y};
GeneralPath polygon = new GeneralPath(GeneralPath.WIND_EVEN_ODD, x1Points.length);
polygon.moveTo(x1Points[0], y1Points[0
for ( int index = 1; index < x1Points.length; index++ ) {
polygon.lineTo(x1Points[index], y1Points[index
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
};
polygon.closePath();
g2.draw(polygon);
g2.drawString("GeneralPath", x, stringY);
x = 5;
y += gridHeight;
stringY += gridHeight;
/* Realiza los mismo pasos que para el polígono anterior, lo que varía es
* que en este caso no se cierra el polígono
*/
int x2Points[] = {x, x+rectWidth, x, x+rectWidth};
int y2Points[] = {y, y+rectHeight, y+rectHeight, y};
GeneralPath polyline = new GeneralPath(GeneralPath.WIND_EVEN_ODD, x2Points.length);
polyline.moveTo (x2Points[0], y2Points[0
*/
GradientPaint relleno = new GradientPaint(x,y,red,x+rectWidth, y,Color.yellow);
g2.setPaint(relleno);
g2.fill(new RoundRectangle2D.Double(x, y, rectWidth,
rectHeight, 10, 10));
g2.setPaint(fg);
/* Define los arreglos de las coordenadas para el polígono. Crea el polígono uniendo
* los puntos con líneas. Asigna el color rojo y dibuja el polígono relleno.
* Retorna el valor de la pintura a negro y dibuja el polígono mediante draw, lo
* que srcina que se sibuje el filete del polígono.
*/
int x3Points[] = {x, x+rectWidth, x, x+rectWidth};
int y3Points[] = {y, y+rectHeight, y+rectHeight, y};
GeneralPath filledPolygon = new GeneralPath(GeneralPath.WIND_EVEN_ODD,
x3Points.length);
filledPolygon.moveTo(x3Points[0], y3Points[0
for ( int index = 1; index < x3Points.length; index++ ) {
filledPolygon.lineTo(x3Points[index], y3Points[index
};
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
filledPolygon.closePath();
g2.setPaint(Color.yellow);
g2.fill(filledPolygon);
g2.setPaint(fg);
g2.setStroke(wideStroke);
g2.draw(filledPolygon);
El siguiente código crea una curva cuadrática con dos puntos finales y un punto de
control. Las posiciones de los puntos se seleccionan con respecto al tamaño de la
ventana.
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
Dimension d = getSize();
int w = d.width;
int h = d.height;
//Crea los objetos que definen los puntos de inicio, final y control
Point2D.Double inicio, fin, control;
inicio = new Point2D.Double();
fin = new Point2D.Double();
control = new Point2D.Double();
//Dibuja la curva
g2.draw(quad);
}
//Clase que se ejecuta
public static void main(String s[]) {
//Crea el Frame
JFrame f = new JFrame("Dibujando un QuadCurve2D");
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);}
});
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
f.setSize(new Dimension(400,300));
f.show();
}
}
Intente
que dibujeimplementar
una curvauna aplicación
cúbica, dibuje
también los puntos de referencia para
la curva, mediante rectángulos
rellenos. Aplique diferentes tipos de
filete, a partir de lo ya visto.
Lección 37 Áreas
Con la clase Area se pueden realizar operaciones boolenas, como uniones,
intersecciones y substracciones, sobre dos objetos Shape cualquiera. Esta técnica,
permite crear rápidamente objetos Shape complejos sin tener que describir cada
línea de segmento o cada curva, este proceso se denomina construir un área
geométrica (CAG). Una Area soporta las siguientes operaciones booleanas.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
unión Sustracción
Or-Exclusivo
Intersección (XOR)
import java.awt.event.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.applet.*;
import javax.swing.*;
/*
* Este applet dibuja una pera, usando métodos de Constructive Area Geometry (CSG)
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
setBackground(Color.white);
}
int w = d.width;
int h = d.height;
double ew = w/2;
double eh = h/2;
g2.setColor(Color.green);
*/
leaf.setFrame(ew-16, eh-29, 15.0, 15.0);
leaf1 = new Area(leaf);
leaf.setFrame(ew-14, eh-47, 30.0, 30.0);
leaf2 = new Area(leaf);
leaf1.intersect(leaf2);
g2.fill(leaf1);
g2.setColor(Color.black);
/* Crea el pedazo de tronco a partir del llenado del Area resultante de la sustracción de
g2.setColor(Color.yellow);
}
public static void main(String s[]) {
JFrame f = new JFrame("Pera");
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);}
});
A continuación
Los otros estilossedisponibles
crea un objeto Font conBOLD
son ITALIC, un estilo Font.PLAIN y un tamaño de 10.
y BOLD+ITALIC.
Font thisFont;
...
Para controlar la fuente que se utiliza para dibujar el texto, es necesario enviar los
atributos de la fuente al contexto Graphics2D antes de renderizar. Los atributos de
la fuente se envían pasando un objeto Font al método setFont. En este ejemplo,
los atributos son envidos al construir el nuevo objeto Font y la cadena se dibuja en
el centro del componente usando esta fuente. Cada vez que se modifiquen los
atributos, se construye un nuevo objeto Font y se envía al contexto Graphics 2D en
el metodo Paint() para que sean redibujados. El método getFontMetrics permite
medir la longitud en píxeles de la cadena considerando los nuevos atributos, de
manera que siempre se dibuje en el centro del componente.
g2.setFont(thisFont);
String cadena = "Seleccione una fuente, tamaño y estilo para modificarme";
FontMetrics medida = g2.getFontMetrics();
int ancho = medida.stringWidth( cadena );
int alto = medida.getHeight();
//Dibuja la cadena en el centro del panel correspondiente
g2.drawString( cadena, w/2-ancho/2, h/2-alto/2 ); }
import java.lang.Integer;
import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Vector;
pnlTamano.add(lblTamano);
cmbFuente.setMaximumRowCount( 9 );
cmbFuente.addItemListener(this);
nuevafuente = envcmbFuente[0];
pnlLetra.add(cmbFuente);
/*Se asignan los valores para el combo de tamaño, los posibles tamaños serán 10,
*12,14,16,18. Se define como máximo número de filas a mostrar 9. Se agrega el
combo
*al panel correspondiente.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
*/
cmbTamano = new JComboBox( new Object[]{ "10", "12", "14", "16", "18"} );
cmbTamano.setMaximumRowCount( 9 );
cmbTamano.addItemListener(this);
pnlTamano.add(cmbTamano);
/*Se arma el combo de estilo a partir de los estilos predeterminados.se siguen los mismo
*pasos que para los combos anteriores y finalmente se incluye el combo en el panel
*correspondiente.
*/
cmbEstilo = new JComboBox( new Object[]{
"PLAIN",
"BOLD",
"ITALIC",
"BOLD & ITALIC"} );
cmbEstilo.setMaximumRowCount( 9 );
cmbEstilo.addItemListener(this);
cmbTamano.setMaximumRowCount( 9 );
pnlEstilo.add(cmbEstilo);
} else {
nuevotam = (String)cmbTamano.getSelectedItem();
}
//Cambia la fuente del contexto, de acuerdo con los nuevos atributos seleccionados en los
combo
fontC.cambiarFuente(nuevafuente, nuevoestilo, nuevotam);
}
Font thisFont;
public pnlLetra(){
thisFont = new Font("Arial", Font.PLAIN, 10);
}
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
// Este método es el que modifica la fuente de acuerdo con los nuevos parámetros
public void cambiarFuente(String nf, int nest, String ntam){
Integer nuevoTam = new Integer(ntam);
int tam = nuevoTam.intValue();
thisFont = new Font(nf, nest, tam);
repaint();
}
g2.setColor(Color.darkGray);
g2.setFont(thisFont);
Lección 39 Imágenes
El API 2D de Java implementa un nuevo modelo de imagen que permite la
manipulación de imágenes de resolución fija almacenadas en memoria. La clase
BufferedImage es una nueva clase Image en el paquete java.awt.image, que puede
usarse para manipular datos de una imagen recuperados desde un archivo o una
URL. Por ejemplo, se puede usar un BufferedImage para implementar doble búfer .
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Transformación afin
Escalado
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Modificación de Aspecto
Combinación Linear de Bandas
Conversión de color
Convolución.
Para filtrar un BufferedImage usando una de las clases de operación de imagense
debe:
1. Constuir una instancia de una de las clases BufferedImageOp:
AffineTransformOp, BandCombineOp, ColorConvertOp, ConvolveOp,
LookupOp , o RescaleOp.
2. Llamar al método de operación filter, pasando el BufferedImage que se
desea filtrar y el BufferedImage donde se quiere almacenar el resultado.
El siguiente ejemplo, tomado del Tutorial de Java 2D de Sun Microsystems ilustra
el uso de cuatro operaciones de filtrado de imagenes: low-pass, sharpen, lookup, y
rescale. Se hicieron algunas modificaciones, pues se presentaban errores al
cargar los archivos de imagen. El resultado de la ejecución es la pantalla que se
muestra en la Figura 67.
cop.filter(srcbimg,dstbimg);
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.image.*;
import java.awt.geom.AffineTransform;
import java.awt.font.TextLayout;
import java.awt.event.WindowEvent;
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
import java.awt.event.WindowListener;
import java.awt.event.WindowAdapter;
import java.applet.*;
import java.net.URL;
*/
try {
MediaTracker tracker = new MediaTracker(this);
tracker.addImage(imagen, 0);
tracker.waitForID(0);
}
catch ( Exception e ) { }
int iancho = imagen.getWidth(this);
int ialto = imagen.getHeight(this);
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
}
}
g2.setColor(Color.black);
float[][] datos = {{0.1f, 0.1f, 0.1f, // Matriz del Filtro
0.1f, 0.2f, 0.1f,
0.1f, 0.1f, 0.1f},
SHARPEN3x3_3};
//BufferedImage srcinal
switch ( i ) {
case 0 :
case 1 : x = i==0?5:anchoap/2+3; y = 15;
Kernel kernel = new Kernel(3,3,datos[i
f.getContentPane().add("Center", elapplet);
elapplet.init();
f.pack();
f.setSize(new Dimension(610,450));
f.show();
}
}
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;
import java.awt.image.*;
add(new BSMCanvas());
lblTexto = new Label("Arrastre el rectángulo dentro del área");
add("South", lblTexto);
}
/* Toma las coordenas de la última vez que el usuario presiono el mouse y se ejecutó
* el evento mousePressed.
*/
int ult_x, ult_y;
boolean primeraVez = true;
TexturePaint texturaRelleno, texturaFilete;
Rectangle area;
/* Esta variable es True si el usuario dió clic o movio el mouse fuera del area del rectangulo,
* falso de lo contrario
*/
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
addMouseListener(this);
contexto.dispose();
contexto.dispose();
}
estaFuera = true;
}
}
// Maneja el evento cuando el usuario arrastra el mouse miesntras mantiene presionado el botón.
public void mouseDragged(MouseEvent e){
if(!estaFuera){
updateLocation(e);
} else {
BufferedShapeMover.lblTexto.setText("Posicione el cursor en el rectángulo y luego
arrastre");
}
}
/* Chequea si el cursor está dentro del rectángulo cuando el usuario suelta el botón del mouse
* e.getX y e.getY proporcionan las coordenadas donde se soltó el botón
*/
if(rect.contains(e.getX(), e.getY())){
updateLocation(e);
} else {
BufferedShapeMover.lblTexto.setText("Posicione el cursor en el rectángulo y luego
arrastre");
estaFuera = false;
}
}
/* Si el método chequearRect retorna verdadero actualiza el contenido del texto para que
* muestre la localización actual del rectángulo, de lo contrario muestr un mensaje
*/
if (chequearRect()) {
BufferedShapeMover.lblTexto.setText("Rectángulo localizado en " +
if(primeraVez){
Dimension dim = getSize();
int ancho = dim.width;
int alto = dim.height;
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
if (area == null) {
return false;
}
if(area.contains(rect.x, rect.y, 100, 50)){
return true;
}
int nuevo_x = rect.x;
int nuevo_y = rect.y;
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
if((rect.x+100)>area.width){
nuevo_x = area.width-99;
}
if(rect.x < 0){
nuevo_x = -1;
}
if((rect.y+50)>area.height){
nuevo_y = area.height-49;
}
if(rect.y < 0){
nuevo_y = -1;
}
rect.setLocation(nuevo_x, nuevo_y);
return false;
}
Además del paquete corazón de Java 3D, se usan otros paquetes para escribir
programas Java 3D. Uno de estos paquetes es com.sun.j3d.utils al que
normalmente se hace referencia como clases de utilidades de Java 3D. El paquete
de las clases corazón incluye sólo las clases de menor nivel necesarias en la
programación Java 3D.
Las clases de utilidades son adiciones convenientes y poderosas al corazón. Estas
clases se dividen en cuatro categorías: cargadores de contenidos, ayudas a la
construcción del escenario gráfico, clases de geometría y utilidades de
conveniencia.
Al utilizar las clases de utilidades se reduce significativamente el número de líneas
de código en un programa Java 3D. Además de las clases de los paquetes corazón
y de utilidades de Java 3D, todo programa 3D usa clases de los paquetes java.awt
y javax.vecmath.
En el resto del texto, el término objeto visual se utilizará para hacer referencia a un
"objeto del escenario gráfico" (por ejemplo, un cubo o una esfera). El término objeto
sólo se usará para referirse a un ejemplar de una clase. El término contenido se
usará para referirnos a objetos visuales en un escenario gráfico como un todo.
ejemplares de lasJava
entre ejemplares clases
3D.Java 3D. Los arcos representan dos tipos de relaciones
La relación más común es padre-hijo. Un nodo Group puede tener cualquier
número de hijos, pero sólo un padre. Un nodo hoja sólo puede tener un padre y no
puede tener hijos. La otra relación es una referencia. Una referencia asocia un
objeto NodeComponent con un nodo del escenario gráfico. Los objetos
NodeComponent definen la geometría y los atributos de apariencia usados para
renderizar los objetos visuales.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Sólo existe un camino desde la raíz de un árbol a cada una de las hojas; por lo
tanto, sólo hay un camino desde la raíz hasta el escenario gráfico de cada nodo
hoja. El camino desde la raíz de un escenario gráfico hasta una hoja especificada
es el camino al escenario gráfico del nodo hoja. Como un camino de un escenario
gráfico trata exactamente con un sola hoja, hay un camino de escenario gráfico
para cada hoja en el escenario.
Todo camino de escenario gráfico en un escenario gráfico Java 3D especifica
completamente la información de estado de su hoja. Esta información incluye, la
localización, la orientación y el tamaño del objeto visual. Consecuentemente, los
atributos visuales de cada objeto visual dependen sólo de su camino de escenario
gráfico. El renderizador Java 3D se aprovecha de este hecho y renderiza las hojas
en el orden
no tiene quesobre
control él determina
el ordenmás eficiente. Elde
de renderizado programador
los objetos. Java 3D normalmente
Las representaciones gráficas de un escenario gráfico pueden servir como
herramienta de diseño y/o documentación para los programas Java 3D. Los
escenarios gráficos se dibujan usando símbolos gráficos estándar como se ve en la
Figura 69. Los programas Java 3D podrían tener más objetos que los que hay en
su escenario gráfico.
Para diseñar un universo virtual Java 3D se dibuja un escenario gráfico usando un
conjunto de símbolos estándar. Después de completar el diseño, este escenario
gráfico es la especificación para el programa. Después de completar el programa,
el mismo escenario gráfico es una representación concisa del programa
(asumiendo que se siguió la especificación).
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Es posible crear un escenario gráfico ilegal. Se puede ver uno en la Figura 71. Este
escenario es ilegal porque viola las propiedades de un DAG. El problema son los
dos objetos TransformGroup(TG) que tienen al mismo objeto Shape3D como hijo.
Recuerda que una hoja sólo puede tener un padre. En otras palabras, sólo puede
haber un camino desde el objeto Locale hasta la hoja (o un camino desde la hoja
hasta el objeto Locale).
Clase Node
La clase Node es una superclase abstracta de las clases Group y Leaf. Esta clase
define algunos de los métodos importantes de sus subclases. Las subclases de
Node componen escenarios gráficos.
Clase Group
La clase Group es la superclase usada en especificación de localización y
orientación de objetos visuales en el universo virtual. Dos de las subclases de
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Esta receta ignora algunos detalles pero ilustra el concepto fundamental para toda
la programación Java 3D: crear la rama gráfica del escenario gráfico es la
programación principal. En vez de ampliar esta receta, los siguientes párrafos
explican una forma sencilla de construir un escenario gráfico muy similar con
menos programación.
Los programas Java 3D escritos usando la receta básica tienen ramas de vista
gráfica con idéntica estructura. La regularidad de la estructura de las ramas de vista
gráfica tambien se encuentra en la clase de utilidad SimpleUniverse. Los
ejemplares de esta clase realizan los pasos 2, 3 y 4 de la receta básica. Usando la
clase SimpleUniverse en programación Java 3D se reduce significativamente el
tiempo y el esfuerzo necesario para crear las ramas de vista gráfica.
Consecuentemente, el programador tiene más tiempo para concentrarse en el
contenido. Esto es de lo que se trata el escribir programas Java 3D.
La clase SimpleUniverse es un buen punto de inicio en la programación Java 3D,
porque permite al programador ignorar las ramas de vista gráfica. Sin embargo,
usar SimpleUniverse no permite tener varias vistas de un universo virtual.
La clase SimpleUniverse se usa en todos los ejemplos de programación de este
tutorial.
La clase SimpleUniverse
El constructor de SimpleUniverse crea un escenario gráfico que incluye un objeto
VirtualUniverse y Locale, y una rama de vista gráfica completa. Esta rama gráfica
creada usa un ejemplar de las clases de conveniencia ViewingPlatform y Viewer en
lugar de las clases corazón usadas para crear una rama de vista gráfica. Observe
que SimpleUniverse sólo usa indirectamente los objetos View y ViewPlatform del
corazón Java 3D. Los objetos SimpleUniverse suministran la funcionalidad de todos
los objetos que hay dentro del recuadro azul de la Figura 74.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Figura 74 Universo virtual mínimo proporcionado por la clase SimpleUniverse (en azul)
Paquete: com.sun.j3d.utils.universe
Esta clase configura un entorno de usuario mínimo para obtener rápida y fácilmente
un programa Java 3D y ejecutarlo.
Esta clase de utilidad crea todos los objetos necesarios para la rama de vista
gráfica. Especificamente crea los objetos Locale, VirtualUniverse, ViewingPlatform,
y Viewer (todos con sus valores por defecto). Los objetos tiene las relaciones
apropiadas para formar la rama de vista gráfica.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Los típicos programas Java 3D mueven la vista hacía atrás (z positivo) para hacer
que los objetos se acerquen, al srcen dentro de la vista. La clase SimpleUniverse
tiene un miembro que es un objeto de la clase ViewingPlatform. Esta clase tiene un
método setNominalViewingTransform que selecciona la posición del ojo para que
esté centrado en (0, 0, 2.41) buscando en dirección z negativa hacia el srcen.
while(true) {
Procesos de entrada
If (petición de salida) break
Realiza comportamientos
Atraviesa el escenario gráfico
y renderiza los objetos visuales
}
Limpieza y salida
clase
clase Applet.
Applet. El
Losejemplo HelloJava3Da.java
programas es una
Java 3D podrían clase definida
escribirse para extender
como aplicaciones, la
pero
usar applets ofrece una forma más sencilla de producir una aplicación con
ventanas.
La clase principal de un programa Java 3D normalmente define un método para
construir la rama de contenido gráfico. En el ejemplo HelloJava3Da dicho método
está definido como createSceneGraph(). Los pasos de la receta sencilla se
implementan en el constructor de la clase HelloJava3Da, que se muestra en la
Figura 76.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Los tres fragmentos de código anteriores (Figura 76, Figura 77 y Figura 78) forman
un programa Java 3D completo cuando se usan las sentencias import adecuadas.
A continuación se pueden ver las sentencias import necesarias para compilar la
clase HelloJava3Da. Las clases más comunmente usadas en Java 3D se
encuentran en los paquetes javax.media.j3d, o javax.vecmath.
Como no se explica cada línea de código del ejemplo HelloJava3Da, las ideas
básicas de ensamblar un programa Java 3D deberían estar claras habiendo leído el
ejemplo. La siguiente sección presenta cada una de las clases usadas en el
programa.
de BranchGroup
únicos son ser
que pueden la raíz de de
hijos los los
sub-gráficos. Los objetos
objetos Locale. BranchGroup
Los objetos son los
BranchGroup
pueden tener varios hijos. Los hijos de un objeto BranchGroup pueden ser otros
objetos Group o Leaf.
El constructor por defecto de BranchGroup es:
BranchGroup() Los ejemplares de BranchGroup sirven como raíz para las
ramas del escenario gráfico; los objetos BranchGroup son los únicos objetos que
pueden insertarse en un conjunto de objetos Locale.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Clase Canvas3D
La clase Canvas3D deriva de la clase Canvas del AWT. Por lo menos un objeto
Canvas3D debe ser referenciado en la rama de vista gráfica del escenario gráfico.
El constructor de Canvas3D es:
Canvas3D(GraphicsConfiguration graphicsconfiguration) Construye e
inicializa un nuevo objeto Canvas3D que el Java 3D puede renderizar dando un
objeto GraphicsConfiguration válido. Es una extensión de la clase Canvas del AWT.
Clase Transform3D
Los objetos Transform3D representan transformaciones de geometrías 3D como
una traslación o una rotación. Estos objetos normalmente sólo se usan en la
creacción de un objeto TransformGroup. Primero, se construye el objeto
Transform3D, posiblemente desde una combinación de objetos Transform3D.
Luego se construye el objeto TransformGroup usando el objeto Transform3D.
Un objeto
matriz de doubles
de 4x4 transformación generalizado
de punto flotante. La se representa internamente
representación como
matemática es una
la mejor
forma. Un objeto Transform3D no se usa en un escenario gráfico. Se usa para
especificar la transformación de un objeto TransformGroup.
El constructor por defecto de Transform3D
Transform3D() Construye un objeto Transform3D que representa la matriz de
identidad (no la transformación).
Un objeto Transform3D puede representar una traslación, una rotación, un
escalado, o una combinación de éstas. Cuando se especifica una rotación, el
ángulo se expresa en radianes. Una rotación completa es 2 PI radianes. Una forma
de especificar
valores ángulos Algunas
directamente. es usar la constante Math.PI.
aproximaciones Otraesforma
son: 45º es 90º
0.785, especificar
es 1.57,losy
180º es 3.14.
A continuación se presenta una lista parcial de métodos de Transform3D
void rotX(double angle) Selecciona el valor de esta transformación a una
rotación en contra del sentido del reloj sobre el eje-x. El ángulo se especifica en
radianes.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Clase TransformGroup
Como una subclase de la clase Group, los ejemplares de TransformGroup se usan
en la creacción de escenarios gráficos y tienen una colección de objetos nodos
como hijos. Los objetos TransformGroup contienen transformaciones geométricas
como traslaciones y rotaciones. La transformación normalmente se crea en un
objeto Transform3D, que no es un objeto del escenario gráfico.
Los contructores de TransformGroup son:
TransformGroup() Construye e inicializa un TransformGroup usando una identidad
de transformación.
TransformGroup(Transform3D t1) Construye e inicializa un TransformGroup
desde un objeto Transform3D t1 pasado como parámetro.
La transformación contenida en un objeto Transform3D se copia a un objeto
TransformGroup o cuando se crea el TransformGroup, o usando el método
setTransform(). Así:
voideste
de setTransform(Transform3D Selecciona
t1) valor
TransformGroup a partir del de deellacomponente de transformación
transformación pasada en el
parámetro t1.
Clase Vector3f
Vector3f es una clase matemática que se encuentra en el paquete javax.vecmath
para especificar un vector usando tres valores de punto flotante para las
coordenadas x, y, e z. Los objetos Vector se usan frecuentemente para
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Clase ColorCube
ColorCube es una clase de utilidad que se encuentra en el paquete
com.sun.j3d.utils.geometry que define la geometría y colores de un cubo
centrado en el srcen y con diferentes colores en cada cara, ColorCube extiende la
clase Shape3D, por lo tanto, es un nodo hoja. Si un cubo sin rotar se sitúa en el
srcen (como en HelloJava3Da), se verá la cara roja desde la localización de visión
nominal. Los otros colores son azul, magenta, amarillo, verde y cian.
Los coonstructores de ColorCube son:
ColorCube() Construye un cubo de color del tamaño por defecto. Por defecto, una
esquina está situada a 1 unidad de cada uno de los ejes desde el srcen,
resultando un cubo que está centrado en el srcen y tiene 2 unidades de alto, de
ancho y de profundo.
ColorCube(double scale) Construye un cubo de color escalado por el valor
especificado. El tamaño por defecto es 2 unidades de lado. El ColorCube resultante
tiene esquinas en (scale, scale, scale) y (-scale, -scale, -scale).
.
*/
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.event.*;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
rotate.rotX(Math.PI/4.0d);
tempRotate.rotY(Math.PI/5.0d);
rotate.mul(tempRotate);
objRoot.addChild(objRotate);
objRotate.addChild(new ColorCube(0.4));
add("Center", canvas3D);
simpleU.getViewingPlatform().setNominalViewingTransform();
simpleU.addBranchGraph(scene);
} // Fin del constructor HelloJava3Db
Capacidades
Una vez que una rama gráfica empieza a vivir o es compilada el sistema de
renderizado Java 3D la convierte a una representación interna más eficiente. El
efecto más importante de esta conversión es la mejora del rendimiento de
renderizado.
Pero también tiene otros efectos, uno de ellos es fijar el valor de transformaciones y
otros objetos en el escenario gráfico. A menos que especificamente se le
proporcionen al programa, este no tendrá la capacidad de cambiar los valores de
los objetos del escenario gráfico una vez que estén vivos.
Hay casos en que un programa necesita la capacidad de cambiar estos valores
después de que estén vivos. Por ejemplo, cambiar el valor de un objeto
TransformGroup crea animaciones. Para que esto suceda, la transforamción debe
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
poder cambiar después de estar viva. La lista de parámetros a los que se puede
acceder, y de que forma, se llama capacidades del objeto.
Cada SceneGraphObject tiene un conjunto de bits de capacidad. Los valores de
estos bits determinan que capacidades existen para el objeto después de
compilarlo o de darle vida. El conjunto de capacidades varía con la clase.
SceneGraphObject es la superclase de casi cualquier clase usada para crear un
escenario gráfico, incluyendo Group, Leaf, y NodeComponent.
A continuación se presenta la lista parcial de métodos de SceneGraphObject.
void clearCapability(int bit) Borra el bit de capacidad especificado.
boolean getCapability(int bit) Recupera el bit de capcidad especificado.
void setCapability(int bit) Configura el bit de capacidad especificado.
Como ejemplo, para poder leer el valor de la transformación representada por un
objeto TransformGroup, esta capacidad debe activarse antes de compilarlo o darle
vida. De forma similar, para poder cambiar el valor de la transformación en un
objeto TransformGroup, su capacidad de escribir transformación debe configurarse
antes de compilarlo o darle vida. Intentar hacer un cambio en un objeto vivo o
compilado para el que la propiedad adecuada no se ha configurado resultará en
una excepción.
En la siguiente sección, las animaciones se crean usando una transformación de
rotación que varía con el tiempo. Para que esto sea posible, el objeto
TransformGroup debe tener su capacidad ALLOW_TRANSFORM_WRITE
activada antes de que sea compilado o se le de vida.
A continuación se presenta la lista parcial de capacidades de TransformGroup. Las
dos capacidades listadas aquí son las únicas definidas por TransformGroup. Éste
hereda varias capacidades de sus clases ancestros: Group y Node. La
configuración de capacidades se puede seleccionar, eliminar o recuperar usando
los métodos definidos en SceneGraphObject.
ALLOW_TRANSFORM_READ Especifica que el nodo TransformGroup permite
acceder a la información de transformación de su objeto.
ALLOW_TRANSFORM_WRITE Especifica que el nodo TransformGroup permite
escribir la información de transformación de su objeto.
Las capacidades también controlan el acceso a otros aspectos de un objeto
TransformGroup. Los objetos TransformGroup heredan configuración de
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
visual
objeto oTransformGroup
de un grupo de objetos
a una visuales. Un objeto RotationIterpolator
rotación especififca cambia
en repuesta a un valor un
de un
objeto Alpha. Como el valor de este objeto cambia cada vez, la rotación también
cambia. Un objeto RotationInterpolator es flexible en la especificación del eje de
rotación, el ángulo de inicio y el ángulo final.
Para rotaciones constantes sencillas, el objeto RotationInterpolator tiene el
siguiente constructor que puede usarse para eso:
RotationInterpolator(Alpha alpha, TransformGroup target) Este constructor usa
valores por defecto de algunos parámetros del interpolador para construir una
rotación completa sobre el eje y, usando el TransformGroup especificado. Los
parámetros son:
alpha: la función de variación de tiempo para referencia.
target: el objeto TransformGroup a modificar.
El objeto TransformGroup de un interpolador debe tener la capacidad de escritura
activada.
Mapear una acción en el tiempo se hace usando un objeto Alpha. La especificación
de este objeto puede ser compleja.
Clase Alpha
Los objetos de la clase Alpha se usan para crear una función que varía en el
tiempo. La clase Alpha produce un valor entre cero y uno, inclusives. El valor que
produce depende de la hora y de los parámetros del objeto Alpha. Los objetos
Alpha se usan comunmente con un comportamiento Interpolator para proporcionar
animaciones de objetos visuales.
Alpha tiene diez parámetos, haciendo la programación tremendamente flexible. Sin
entrar en detalles de cada parámetro, saber que un ejemplar de Alpha puede
combinarse fácilmente con un comportamiento para proporcionar rotaciones
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
Región Progamada
Clase BoundingSphere
Especificar un límite esférico se consigue especificando un punto central y un rádio
para la esfera. El uso normal de este tipo de límites es usar el centro a (0, 0, 0).
Entonces el radio se selecciona lo suficientemente grande como para contener el
objeto visual, incluyendo todas las posibles localizaciones del objeto.
Algunos de los constructores de BoundingSphere son:
BoundingSphere() Este constructor crea una límite esférico centrado en el srcen
(0, 0, 0) con un radio de 1.
BoundingSphere(Point3d center, double radius) Construye e inicializa un
BoundingSphere usando el punto central y el rádio especificados.
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.event.*;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
rotate.rotX(Math.PI/4.0d);
tempRotate.rotZ(Math.PI/5.0d);
rotate.mul(tempRotate);
objRoot.addChild(objRotate);
objRotate.addChild(objSpin);
RotationInterpolator rotator =
new RotationInterpolator(rotationAlpha,
objSpin, yAxis,
0.0f, (float)
Math.PI*2.0f);
return objRoot;
} // Fin del método CreateSceneGraph
public HelloJava3Dd() {
setLayout(new BorderLayout());
simpleU.getViewingPlatform().setNominalViewingTransform();
simpleU.addBranchGraph(scene);
} // Fin del constructor de HelloJava3Dd
MANZANEDO, Miguel Angel et al. Guía rápida de aprendizaje del lenguaje Java.
[En línea] http://pisuerga.inf.ubu.es/lsi/Invest/Java/Tuto.Oct98/index.htm. Fecha de
consulta: Noviembre de 2005.
OVERCLOCKERS. CL. Definición del término Alpha Blending. [En línea]
http://www.overclockers.cl/modules.php?name=enciclopedia&ver=4 Fecha de
consulta: Enero de 2006.
PLANETALIA.COM. Curso para la programacion de un juego de marcianitos en
Java. [En línea] http://www.planetalia.com/cursos/Java-Invaders/JAVA-INVADERS-
00.clase. Fecha de consulta: Diciembre de 2005.
PLANETALIA.COM. Videojuegos programados en Java. [En línea]
http://www.planetalia-exitos.com/videojuegos.jsp. Fecha de consulta: Diciembre de
2005.
PROGRAMACIÓN EN CASTELLANO. Curso de programacion Java en 3D.
Traducción del curso de Sun Microsystems realizada por Juan Antonio Palos (ozito)
[En línea] http://www.programacion.com/tutorial/3d/1/. Fecha de consulta:
Noviembre de 2005.
– UNAD
UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
Escuela de Ciencias Básicas, Tecnología e Ingeniería
Ingeniería de Sistemas Módulo del curso Computación Gráfica