Documente Academic
Documente Profesional
Documente Cultură
DIRECTORIO
Mtro. Sergio Pablo Mariscal Alvarado
Director General ITESCA
Lic. Clara E. Mark Corona
Subdirectora
Mtro. Alejandro Faccinetto Ruiz
Jefe de la Divisin Acadmica
Mtra. Lilia B. Navarro Fragoso
Jefa del Departamento de Desarrollo Acadmico
Mtro. Leobardo Rodrguez
Jefe de Carrera Ingeniera en Sistemas Computacionales
Mtra. Ana Cecilia Ruiz Calvillo
Elaborador del Manual
ESTE MANUAL FUE REALIZADO PARA USO EXCLUSIVO DEL INSTITUTO TECNOLGICO
SUPERIOR DE CAJEME
D.R. ITESCA, Cd.Obregn, Sonora; Mxico. Carretera Internacional a Nogales Km. 2.
Tel. (644) 410-86-50
INDICE
INTRODUCCIN
6
10
10
13
16
1.2.4 OpenGL.
19
1.2.5 Java.
21
24
26
28
2. TRANSFORMACIONES GEOMTRICAS
2.1 Transformaciones bidimensionales.
30
32
36
45
49
53
54
56
56
61
71
3. MODELADO GEOMTRICO
3.1 Modelos geomtricos.
76
3.2 Proyecciones.
90
94
96
99
102
105
105
112
122
ANEXOS
Anexo 1. Preguntas y Ejercicios de Unidad 1.
126
128
132
137
139
141
GLOSARIO
142
BIBLIOGRAFA
147
INTRODUCCIN
El rpido desarrollo del hardware de computadora, las aplicaciones grficas y
tecnologas de red han hecho que la graficacin por computadora sea un tema
crucial en estos das. El modelado y renderizado de objetos grficos virtuales, son
los principales objetivos de la graficacin. Los tpicos involucrados con este
proceso abarcan una gran rama de disciplinas desde las matemticas y
tecnologas de informacin hasta psicologa, medicina, ingeniera y arte.
La materia de graficacin tiene por objetivo lograr que el estudiante aplique
tcnicas y algoritmos bsicos de representacin y visualizacin de objetos en dos
y tres dimensiones para desarrollar modelos de simulacin e interfaces hombre
mquina. El presente manual pretende ayudar a lograr dicho objetivo; ya que
contiene ejemplos de programas que ilustran cada concepto introducido. Cuenta
con un anexo de preguntas y programas a resolver por unidad, para reforzar el
aprendizaje adquirido; as como un glosario de terminolga relacionada con la
graficacin. Est dividido en tres secciones:
Introduccin a la graficacin por computadora: se presenta conceptos
fundamentales de la graficacin, su objetivo y aplicaciones, as como la
evolucin de los lenguajes de programacin utilizados para su desarrollo.
Transformaciones geomtricas: se dan a conocer los principales
conceptos y aplicaciones de transformaciones geomtricas en dos y tres
dimensiones, as como la representacin matricial de objetos grficos.
Modelado geomtrico: se dan a conocer las tcnicas para la
representacin tridimensional de objetos y sus diferentes proyecciones en
el rea de vista.
Se ha utilizado el lenguaje de programacin Java ya que es un lenguaje de
programacin multiplataforma, es simple y orientado a objetos. Se emplean sus
aplicaciones en Java 2D y Java 3D debido a que son paquetes que proporcionan
grandes capacidades y poderosas interfaces para el modelado y programacin de
grficos.
INTRODUCCIN A LA
GRAFICACIN POR
COMPUTADORA
1.1 Introduccin.
La graficacin por computadora estudia la teora y las tcnicas de modelado,
procesamiento y renderizado de objetos grficos en computadoras. El objetivo
bsico de la graficacin por computadora es construir un mundo virtual a partir de
objetos grficos y renderizar una escena del modelo virtual a un dispositivo grfico
a partir de vistas especficas.
Figura 1.1 Tareas principales de la graficacin por computadora: modelando un mundo virtual y
renderizandolo a una escena
necesitan
almacenarse
son
fciles
de
implementar.
Las
Estos algoritmos y mtodos han hecho que la graficacin por computadora sea un
tema considerado como tcnicamente difcil y complejo.
10
11
out dx,al
mov dx,3c9h
mov al,63 ; red
out dx,al
mov al,63 ; green
out dx,al
mov al,0 ; blue
out dx,al
mov xc,160
mov yc,100
; center of screen
; Calculate coordinates
mov x, 0
mov y, 50 ; radius 50
mov bx, -49
; 1-radius
mov dE, 3
mov dSE, -95
DRAW:
call Draw_Pixels
; Draw 8 pixels
; move east
; move southeast
MVSE:
NXT:
mov cx, x ; continue if x < y
cmp cx, y
jb DRAW
; Restore Video Mode
mov ah,10h
; wait for keystroke
int 16h
mov ah,0
; reset video mode
mov al,saveMode ; to saved mode
int 10h
.EXIT
main ENDP
; Draw 8 pixels symmetrical about the center
Draw_Pixels PROC
; Calculate the video buffer offset of the pixel.
mov ax, yc
add ax, y
mul w
add ax, xc
add ax, x
mov di, ax
mov BYTE PTR es:[di],1
; store color index
; Horizontal symmetrical pixel
sub di, x
sub di, x
mov BYTE PTR es:[di],1
; store color index
; Vertical symmetrical pixel
mov ax, yc
sub ax, y
mul w
add ax, xc
add ax, x
mov di, ax
mov BYTE PTR es:[di],1
; store color index
12
; Horizontal pixel
sub di, x
sub di, x
mov BYTE PTR es:[di],1
; store color index
; Switch x, y to get other 4 pixels
mov ax, yc
add ax, x
mul w
add ax, xc
add ax, y
mov di, ax
mov BYTE PTR es:[di],1
; store color index
sub di, y
sub di, y
mov BYTE PTR es:[di],1
; store color index
mov ax, yc
sub ax, x
mul w
add ax, xc
add ax, y
mov di, ax
mov BYTE PTR es:[di],1
; store color index
sub di, y
sub di, y
mov BYTE PTR es:[di],1
; store color index
ret
Draw_Pixels ENDP
END main
13
simples. Los programas escritos a este nivel no son portales aun para diferentes
dispositivos en la misma plataforma.
La programacin de interfaces a alto nivel es necesaria para facilitar la carga de la
programacin grfica. Debido a las inherentes complejidades de los problemas
grficos, es deseable proporcionar una capa de abstraccin para la programacin
de aplicaciones. Un lugar natural para agregar dicha abstraccin es el sistema
operativo.
Con el desarrollo y la expansin de aplicaciones de interfaces grficas de usuario
(GUI) en los sistemas modernos de computadora, los grficos soportados en los
sistemas operativos se han convertido cada vez en ms comunes y extensivos.
Las APIs proporcionadas al nivel de sistema operativo proporcionan una interfaz
uniforme para la programacin grfica en la misma plataforma. Normalmente las
diferencias de hardware son complacidas al utilizar drivers especficos para los
dispositivos. Un driver implementa una interface estndar con el sistema operativo
para un dispositivo particular. Los programas de aplicaciones solo necesitan
llamar a funciones grficas estndares proporcionadas por el sistema operativo y
se evitan la tarea de lidiar con las especificaciones del hardware.
Win32 es la API para el sistema operativo de 32 bits de Windows tal como
Windows 9x/ME/NT/2000/XP. El siguiente cdigo muestra un programa de WIN32
que dibuja un crculo. Este es un ejemplo simple de un programa en Windows
escrito en lenguaje C. El programa crea una ventana estndar y llama
directamente al API de WIN32 para dibujar el crculo en el rea del cliente de la
ventana principal del programa. El crculo est centrado en la ventana y el tamao
es ajustado automticamente si la ventana se ajusta.
#include <windows.h>
#include <string.h>
LRESULT CALLBACK
MainWndProc (HWND hwnd, UINT nMsg, WPARAM wParam, LPARAM lParam) {
HDC hdc;
/* Device context used for drawing */
PAINTSTRUCT ps;
/* Paint structure used during drawing */
RECT rc;
/* Client area rectangle */
int
cx;
/* Center x-coordinate */
int cy;
/* Center y-coordinate */
int r;
/* Radius of circle */
14
/* Message processing.*/
switch (nMsg) {
case WM_DESTROY:
/* The window is being destroyed, close the application */
PostQuitMessage (0);
return 0;
break;
case WM_PAINT:
/* The window needs to be redrawn. */
hdc = BeginPaint (hwnd, &ps);
GetClientRect (hwnd, &rc);
/* Calculater center and radius */
cx = (rc.left + rc.right)/2;
cy = (rc.top + rc.bottom)/2;
if (rc.bottom - rc.top < rc.right - rc.left)
r = (rc.bottom - rc.top) / 2 - 20;
else
r = (rc.right - rc.left) / 2 - 20;
Ellipse(hdc, cx-r, cy-r, cx+r, cy+r);
EndPaint (hwnd, &ps);
return 0;
break;
}
return DefWindowProc (hwnd, nMsg, wParam, lParam);
}
int WINAPI
WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow) {
HWND hwndMain; /* Main window handle */
MSG msg;
/* Win32 message structure */
WNDCLASSEX wndclass;
/* Window class structure */
char* szMainWndClass = "WinCircle"; /* The window class name */
/* Create a window class */
/* Initialize the entire structure to zero */
memset (&wndclass, 0, sizeof(WNDCLASSEX));
/* The class Name */
wndclass.lpszClassName = szMainWndClass;
/* The size of the structure. */
wndclass.cbSize = sizeof(WNDCLASSEX);
/* All windows of this class redraw when resized. */
wndclass.style = CS_HREDRAW | CS_VREDRAW;
/* All windows of this class use the MainWndProc window function. */
wndclass.lpfnWndProc = MainWndProc;
/* This class is used with the current program instance. */
wndclass.hInstance = hInst;
/* Use standard application icon and arrow cursor */
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
/* Color the background white */
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
/* Register the window class */
RegisterClassEx (&wndclass);
/* Create a window using the window class */
hwndMain = CreateWindow (
szMainWndClass,
/* Class name */
15
"Circle",
/* Caption */
WS_OVERLAPPEDWINDOW,
/* Style */
CW_USEDEFAULT,
/* Initial x (use default) */
CW_USEDEFAULT,
/* Initial y (use default) */
CW_USEDEFAULT,
/* Initial x size (use default) */
CW_USEDEFAULT,
/* Initial y size (use default) */
NULL,
/* No parent window */
NULL,
/* No menu */
hInst,
/* This program instance */
NULL
/* Creation parameters */
);
/* Display the window */
ShowWindow (hwndMain, nShow);
UpdateWindow (hwndMain);
/* The message loop */
while (GetMessage (&msg, NULL, 0, 0)) {
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return msg.wParam;
}
16
Es fcil ver las ventajas de una interface estndar para programacin grfica. Ya
que sta proporcionar una capa de abstraccin necesaria para dispositivos e
independencia de plataforma.
GKS (Graphics Kernel System) es el primer estndar internacional para
Graficacin por computadora. GKS (ISO 7942 1985) es un estndar para grficos
en 2D. Especifica funciones grficas bsicas independientes de las plataformas
de computadora. Algunos niveles estn definidos para acomodar diferentes
capacidades de sistemas de hardware. Una implementacin de GKS en un
lenguaje de programacin necesitar de una definicin apropiada de sintaxis para
el lenguaje. Un lenguaje cubierta es utilizado para definir el formato especfico del
GKS en el lenguaje de programacin. El lenguaje cubierta ms comn para GKS
es el FORTRAN. Aunque tambin se pueden utilizar otros lenguajes como Pascal
y C.
GKS-3D (ISO 8805 1988) es una extensin del GKS que soporta grficos en 3D.
GKS y GKS-3D estn diseados principalmente para dibujar objetos individuales
con ciertos atributos. Son tiles para primitivas grficas no estructuradas y
estticas, pero no soportan directamente modelos grficos ms complejos.
PHIGS (Programmers Hierarchical Interactive Graphics System, ISO 9592 1991)
es un estndar grfico similar al GKS. PHIGS y PHIGS+ incluyen las capacidades
de GKS. Tienen funcionalidades adicionales para organizaciones jerrquicas de
las primitivas grficas y de edicin dinmica.
El siguiente cdigo muestra la programacin en GKS en el lenguaje cubierta
FORTRAN. El programa dibuja un crculo rojo usando la primitiva polilnea de
GKS. Los puntos del crculo son calculados con funciones trigonomtricas de alto
nivel proporcionadas por FORTRAN.
PROGRAM CIRCLE
C
C Define error file, Fortran unit number, and workstation type,
C and workstation ID.
C
PARAMETER (IERRF=6, LUNIT=2, IWTYPE=1, IWKID=1)
17
PARAMETER (ID=121)
DIMENSION XP(ID),YP(ID)
C
C Open GKS, open and activate a workstation.
C
CALL GOPKS (IERRF,IDUM)
CALL GOPWK (IWKID,LUNIT,IWTYPE)
CALL GACWK (IWKID)
C
C Define colors.
C
CALL GSCR(IWKID,0, 1.0, 1.0, 1.0)
CALL GSCR(IWKID,1, 1.0, 0.0, 0.0)
C
C Draw a circle.
C
X0 = .5
Y0 = .5
R = .3
JL = 120
RADINC = 2.*3.1415926/REAL(JL)
DO 10 J=1,JL+1
X = X0+R*COS(REAL(J)*RADINC)
Y = Y0+R*SIN(REAL(J)*RADINC)
XP(J) = X
YP(J) = Y
10 CONTINUE
CALL GSPLI(1)
CALL GSPLCI(1)
CALL GPL(JL+1,XP,YP)
C
C Deactivate and close the workstation, close GKS.
C
CALL GDAWK (IWKID)
CALL GCLWK (IWKID)
CALL GCLKS
C
STOP
END
18
1.2.4 OpenGL.
OpenGL es una API muy popular para grficos en 2D/3D derivada de GL
(Graphics Library) de Silicon Graphics Inc. GL es la interface de programacin
grfica usada en las estaciones de trabajo de SGI. OpenGL est diseado para
ser abierto y es un estndar neutral. Est disponible virtualmente en todas las
plataformas; de hecho muchos vendedores de hardware ofrecen interfaces
OpenGL para sus tarjetas grficas y dispositivos. Con ms de 200 funciones,
proporciona una API grfica ms poderosa que los estndares de GKS.
OpenGL es una API relativamente de bajo nivel con una interface orientada al
procedimiento y es posible utilizar diferentes lenguajes de programacin. Existe
un lenguaje FORTRAN oficial y actualmente se est desarrollando un lenguaje
cubierta en Java. Sin embargo, la raz de OpenGL es el lenguaje C.
OpenGL consiste en dos libreras: GL y GLU (OpenGL Utility Library). La librera
GL contiene las funciones bsicas de grficos, y la librera GLU contiene
funciones de ms alto nivel creadas a partir de las GL. OpenGL por s solo no
tiene funciones para construir una interfaz de usuario. Es necesario un paquete
portable llamado GLUT (OpenGL Utility Toolkit) que puede ser utilizado con
OpenGL para construir programas grficos completos.
El siguiente cdigo muestra un ejemplo que dibuja un crculo en OpenGL. El
programa utiliza GLUT para construir la interface de usuario y tambin funciones
GL y GLU para construir el display.
#include <GL/glut.h>
#include <math.h>
void display(void) {
int i;
int n = 80;
float a = 2*3.1415926535/n;
float x;
float y;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0,0);
glBegin(GL_LINE_LOOP);
for (i = 0; i < n; i++) {
19
x = cos(i*a);
y = sin(i*a);
glVertex2f(x, y);
}
glEnd();
glFlush();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutCreateWindow("Circle");
glutDisplayFunc(display);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.2, 1.2, -1.2, 1.2);
glClearColor(1.0, 1.0, 1.0, 0.0);
glutMainLoop();
}
20
glLoadIdentity();
glOrtho(-2.0, 2.0, -2.0, 2.0, -2.0, 2.0);
glClearColor(1.0, 1.0, 1.0, 0.0);
glColor3f(1.0, 0.5, 0.5);
sphere = gluNewQuadric();
gluQuadricDrawStyle(sphere, GLU_LINE);
glutIdleFunc(idle);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glutMainLoop();
}
Programa 1.5: Cdigo utilizando OpenGL que muestra una esfera 3D.
1.2.5 Java.
A pesar de que OpenGL ofrece un nivel de abstraccin procedimental en C, no
est diseado para acomodar directamente el modelado grfico en el paradigma
orientado a objetos. Una API de nivel alto de grficos basados en POO puede
ofrecer grandes beneficios a aplicaciones.
Java 2D y Java 3D son APIs grficas asociadas con el lenguaje de programacin
Java. Son APIs orientadas a objetos de alto nivel con gran capacidad de
portabilidad. Java 3D est tpicamente implementada en la cima de otras APIs de
bajo nivel tal como OpenGL. La siguiente tabla muestra una representacin tpica
de las capas de un sistema grfico
21
Aplicacin grfica
Java APIs
Java 3D
Java VM
OpenGL
OS
Driver de Display
Tarjeta Grfica
Display
Tabla 1.2 Capas de los sistemas grficos.
22
Una opcin para la programacin de grficos para Java es OpenGL. Hay varios
proyectos en marcha para desarrollar un lenguaje cubierta de Java para OpenGL.
JOGL es la implementacin de JSR 231: el lenguaje cubierta Java para OpenGL.
JOGL proporciona las clases GL y GLU para encapsular las funciones en GL y
GLU. Los dos componentes GLCanvas y GLJPanel proporcionan las superfices
de dibujo para las llamadas a OpenGL. El GLCanvas es un componente pesado
que utilizar la aceleracin del hardware. El GLJPanel es un componente ligero
implementado en memoria. La aceleracin del hardware no est disponible para
GLJPanel. A continuacin se muestra un ejemplo de JOGL que es el equivalente
del ejemplo visto con OpenGL.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import net.java.games.jogl.*;
public class JOGLDemo {
public static void main(String[] args) {
Frame frame = new Frame("JOGL Demo");
GLCapabilities cap = new GLCapabilities();
GLCanvas canvas = GLDrawableFactory.getFactory().createGLCanvas(cap);
canvas.setSize(300, 300);
canvas.addGLEventListener(new Renderer());
frame.add(canvas);
frame.pack();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.show();
}
static class Renderer implements GLEventListener {
private GL gl;
private GLU glu;
private GLDrawable gldrawable;
public void init(GLDrawable drawable) {
gl = drawable.getGL();
glu = drawable.getGLU();
this.gldrawable = drawable;
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluOrtho2D(-1.2, 1.2, -1.2, 1.2);
gl.glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
}
public void display(GLDrawable drawable) {
int i;
int n = 80;
float a = (float)(2*3.1415926535/n);
float x;
float y;
gl.glClear(GL.GL_COLOR_BUFFER_BIT);
gl.glColor3f(1.0f,0,0);
gl.glBegin(GL.GL_LINE_LOOP);
for (i = 0; i < n; i++) {
x = (float)Math.cos(i*a);
y = (float)Math.sin(i*a);
23
gl.glVertex2f(x, y);
}
gl.glEnd();
gl.glFlush();
}
public void reshape(GLDrawable drawable, int x, int y, int width,
int height) {}
public void displayChanged(GLDrawable drawable, boolean modeChanged,
boolean deviceChanged) {}
}
}
Programa 1.6: Cdigo utilizando JOGL que muestra una esfera 3D.
24
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.font.*;
import java.awt.geom.*;
public class Demo2D extends JApplet{
public static void main(String args[]){
JFrame frame = new JFrame();
frame.setTitle ("Demo Java 2D");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JApplet applet = new Demo2D();
applet.init();
frame.getContentPane().add(applet);
frame.pack();
frame.setVisible(true);
}
public void init(){
JPanel panel = new Panel2D();
getContentPane().add(panel);
}
}
class Panel2D extends JPanel{
public Panel2D(){
setPreferredSize(new Dimension(500, 400));
setBackground(Color.white);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
//dibujar elipse
Shape ellipse = new Ellipse2D.Double(150, 100, 200, 200);
GradientPaint paint = new GradientPaint(100, 100, Color.white, 400, 400, Color.gray);
g2.setPaint(paint);
g2.fill(ellipse);
//establecer transparencia
AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.4f);
g2.setComposite(ac);
g2.setColor(Color.blue);
//dibujar el texto transparente
Font font = new Font("Serif", Font.BOLD, 120);
g2.setFont(font);
g2.drawString("Java", 120, 200);
//obtener el outline del texto en glyph
FontRenderContext frc = g2.getFontRenderContext();
GlyphVector gv = font.createGlyphVector(frc, "2D");
Shape glyph = gv.getOutline(150, 300);
//dibujar el glyph rotado
g2.rotate(Math.PI/6, 200, 300);
g2.fill(glyph);
}
}
25
26
Programa 1.8: Cdigo utilizando Java3D que muestra un globo terrqueo en rotacin y texto.
27
el
renderizado grfico.
La visin por computadora tiene la tarea de tratar de entender las imgenes del
mundo real; visto de cierta manera, un sistema de visin por computadora es lo
inverso a un sistema de graficacin por computadora. Su principal objetivo es
28
29
TRANSFORMACIONES
GEOMTRICAS
30
Transformacin
Vista
31
de los
objetos visuales a los cuales se les aplica dicha transformacin. Las vistas de
transformacin no cambian el modelo del mundo virtual, pero cambian las vistas
de la escena completa en el espacio mundo. Por ejemplo, si en un modelo virtual
con un crculo y un tringulo, se aplica una traslacin al crculo, (transformacin
de objeto) solo se mover el crculo sin afectar el tringulo. La traslacin como
una transformacin de vista, por otro lado, mover la vista completa.
Adems de la geometra, muchos otros atributos pueden afectar el renderizado de
una escena como colores, transparencia, texturizado y estilos de lnea. Un
sistema de grficos 2D renderizar una escena basada en la informacin
geomtrica, transformacin y el contexto grfico involucrando todos los atributos.
32
Dos ejes perpendiculares son colocados en el plano. Cada eje est etiquetado por
un conjunto de nmeros reales. El eje horizontal se denomina eje
y el vertical
y coordenada
. Las coordenadas
Por ejemplo una lnea se puede representar a travs de una ecuacin polinomial
de grado 1 o ecuacin lineal:
Figura 2.3 Lnea que pude ser representada por una ecuacin lineal.
33
ecuacin:
Otro tipo comn de ecuacin que se utiliza para representar una curva es la
ecuacin paramtrica. En lugar de una ecuacin que relacione nicamente a
, se utiliza una tercera variable . Ambas
34
apuntan
hacia abajo. Los valores de las coordenadas son valores enteros. Esta opcin
obviamente es diferente a cualquier representacin matemtica, pero es ms
natural para la mayora de los dispositivos de pantalla.
35
(0,0)
y
Figura 2.5 Sistema de coordenadas de Java 2D, con el eje x aumentando hacia la derecha y el eje
y hacia abajo.
Por default las coordenadas del mundo de Java 2D coinciden con las
coordenadas de los dispositivos. Con las transformaciones disponibles en un
sistema de grficos, es fcil definir diferentes espacios mundo que pueden ser los
ms apropiados para aplicaciones particulares.
tambin
y .
36
Una refleccin mapea el objeto a su imagen espejo sobre una lnea; es decir es
determinado por una lnea. La refleccin es isomtrica, ya que cambia la
orientacin del angulo. La siguiente figura muestra una refleccin de una lnea de
45 grados entre los ejes
y .
37
38
Matemticamente una transformacin afn puede ser representada por una matriz
3 x 3. Una transformacin afn requiere una matriz de 3 x 3 en lugar de una de 2
x 2, debido a que las transformaciones tales como las traslaciones no son lineales
en un espacio 2D. Utilizando el concepto de coordenadas homogneas, es
posible tratar todas las transformaciones afines en un ambiente lineal al agregar
una dimensin al vector de representacin de los puntos.
Para transformaciones bsicas, es comnmente ms sencillo encontrar las
matrices de transformacin directamente. Una rotacin del angulo sobre el
origen es representado con la matriz:
tiene la matriz:
39
La refleccin en la lnea
por el factor
se da por la matriz:
Java 2D utiliza una clase llamada AffineTransform para definir una transformacin
afn. Ofrece mtodos para establecer la mayora de las transformaciones afines
bsicas definidas anteriormente. Los siguientes mtodos de AffineTransform
establecen las transformaciones nombradas:
void setToIdentity()
40
AffineTransform(float m00, float m10, float m01, float m11, float m02, float
m12)
AffineTransform(double[ ] flatmatrix)
AffineTransform(float[ ] flatmatrix)
Debido a que la ltima fila de una matriz de transformacin afin siempre es (001),
se omite en la lista de parmetros. La matriz de refleccin definida anteriormente
puede establecerse por el siguiente mtodo:
transform.setTranform(-1, 0, 0, 1, 0, 0);
Debido a que la clase de AffineTransform permite la escalacin con factores
negativos, la refleccin tambin puede definirse como un tipo especial de
escalacin:
transform.setToScale(-1, 1);
Un objeto AffineTransform puede ser utilizado por ambas transformaciones: de
objeto y de vista. Los siguientes mtodos de la clase se aplican a la
transformacin de objetos geomtricos.
void transform(double[ ] src, int src0ff, double[ ] dst, int dst0ff, int numPts)
void transform(double[ ] src, int src0ff, float[ ] dst, int dst0ff, int numPts)
void transform(float[ ] src, int src0ff, double[ ] dst, int dst0ff, int numPts)
void transform(float[ ] src, int src0ff, float[ ] dst, int dst0ff, int numPts)
Point2D transform(Point2D[ ] src, int src0ff, Point2D[ ] dst, int dst0ff, int
numPts)
void deltaTransform(double[ ] src, int src0ff, double[ ] dst, int dst0ff, int
numPts)
41
42
mi.addActionListener(this);
menu.add(mi);
mi = new JMenuItem("Scaling");
mi.addActionListener(this);
menu.add(mi);
mi = new JMenuItem("Shearing");
mi.addActionListener(this);
menu.add(mi);
mi = new JMenuItem("Reflection");
mi.addActionListener(this);
menu.add(mi);
panel = new TransformPanel();
getContentPane().add(panel);
}
public void actionPerformed(ActionEvent ev) {
String command = ev.getActionCommand();
if ("Translation".equals(command)) {
panel.transformType = panel.TRANSLATION;
} else if ("Rotation".equals(command)) {
panel.transformType = panel.ROTATION;
} else if ("Scaling".equals(command)) {
panel.transformType = panel.SCALING;
} else if ("Shearing".equals(command)) {
panel.transformType = panel.SHEARING;
} else if ("Reflection".equals(command)) {
panel.transformType = panel.REFLECTION;
}
}
}
class TransformPanel extends JPanel implements MouseListener, MouseMotionListener {
static final int NONE = 0;
static final int TRANSLATION = 1;
static final int ROTATION = 2;
static final int SCALING = 3;
static final int SHEARING = 4;
static final int REFLECTION = 5;
int transformType = NONE;
Shape drawShape = null;
Shape tempShape = null;
Point p = null;
int x0 = 400;
int y0 = 300;
public TransformPanel() {
super();
setPreferredSize(new Dimension(800, 600));
setBackground(Color.white);
drawShape = new Rectangle(-50,-50,100,100);
addMouseListener(this);
addMouseMotionListener(this);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.translate(x0, y0);
g2.drawLine(-200,0,200,0);
g2.drawLine(0,-200,0,200);
g2.draw(drawShape);
}
public void mouseClicked(MouseEvent ev) {
}
public void mouseEntered(MouseEvent ev) {
}
public void mouseExited(MouseEvent ev) {
}
43
44
, es
son
, respectivamente, entonces la
. Cabe mencionar que la
es
45
-3
-4
-1/2
1/2
3/2
3/2
-1/2
-3
3/2
-4
46
las
transformaciones
simples
listadas,
es
posible
combinar
las
47
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
public class Composition extends JApplet {
public static void main(String s[]) {
JFrame frame = new JFrame();
frame.setTitle("Transformation Composition");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JApplet applet = new Composition();
applet.init();
frame.getContentPane().add(applet);
frame.pack();
frame.setVisible(true);
}
public void init() {
JPanel panel = new CompositionPanel();
getContentPane().add(panel);
}
}
class CompositionPanel extends JPanel {
public CompositionPanel() {
setPreferredSize(new Dimension(640, 480));
this.setBackground(Color.white);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.translate(100,100);
Shape e = new Ellipse2D.Double(300, 200, 200, 100);
g2.setColor(new Color(160,160,160));
g2.fill(e);
AffineTransform transform = new AffineTransform();
transform.translate(-400,-250);
e = transform.createTransformedShape(e);
g2.setColor(new Color(220,220,220));
g2.fill(e);
g2.setColor(Color.black);
g2.drawLine(0, 0, 150, 0);
g2.drawLine(0, 0, 0, 150);
transform.setToRotation(Math.PI / 6.0);
e = transform.createTransformedShape(e);
g2.setColor(new Color(100,100,100));
g2.draw(e);
transform.setToTranslation(400, 250);
e = transform.createTransformedShape(e);
g2.setColor(new Color(0,0,0));
g2.draw(e);
}
}
48
es
puede ser visto como parte de las propiedades del color que
premultiplicados
s(1-
d),
d(1-
),
d,
y (1-
s)(1-
color cuando este ocurra. En el evento de solo cdigo fuente, una regla puede
49
elegir el matener el color fuente u omitirlo. En el evento solo color destino, el color
destino puede ser seleccionado u omitido, en el evento de ambos colores, una
regla puede elegir el color fuente, el color destino o ninguno de ellos. En el evento
ningn color, una regla solo puede no elegir color. Por lo tanto el nmero total de
reglas basado en este modelo es 2 x 2 x 3 x 1 = 12.
Ninguno
Fuente
Ambos Destino
Figura 2.13 Cuatro eventos diferentes de color que pueden ocurrir en el modelo probabilstico de
composicin.
Por ejemplo, la regla SrcOver elige el color fuente en el evento de solo color
fuente y el evento de ambos colores. Elige el color destino en el evento solo color
destino. No debe elegir ningn color en el evento de ninguno. Por consecuencia la
probabilidad de que ocurra el color fuente en el color es
probabilidad del color destino es
d(1-
s).
s(1-
d),
y la
SrcOver
DstOver
1-
SrcIn
DstIn
SrcOut
0
1d
1
0
0
1-
s
d
DstOut
1-
Src
Dst
50
SrcAtop
1-
DstAtop
1-
Xor
1-
s
s
1-
51
52
53
54
nivel
de
las
transformaciones.
La
clase
Transform3D
encapsula
las
55
las
transformaciones
afines
3D
incluyen
traslaciones,
rotaciones,
56
representadas
como
matriz
de
multiplicaciones.
Las
coordenadas
. Cuando
no
. Con las
57
58
Programa 2.5: Cdigo que proporciona una clase que despliega una matriz.
59
MatrixPanel mp;
Matrix4d m = new Matrix4d();
TextField tf;
public void init() {
this.setLayout(new BorderLayout());
mp = new MatrixPanel();
add(mp, BorderLayout.CENTER);
Panel p = new Panel();
p.setLayout(new GridLayout(6,1));
Button button = new Button("Identity");
button.addActionListener(this);
p.add(button);
button = new Button("Zero");
button.addActionListener(this);
p.add(button);
button = new Button("Negate");
button.addActionListener(this);
p.add(button);
button = new Button("Transpose");
button.addActionListener(this);
p.add(button);
button = new Button("Invert");
button.addActionListener(this);
p.add(button);
button = new Button("Determinant");
button.addActionListener(this);
p.add(button);
this.add(p, BorderLayout.EAST);
tf = new TextField();
add(tf, BorderLayout.SOUTH);
}
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if ("Identity".equals(cmd)) {
mp.get(m);
m.setIdentity();
mp.set(m);
} else if ("Zero".equals(cmd)) {
mp.get(m);
m.setZero();
mp.set(m);
} else if ("Negate".equals(cmd)) {
mp.get(m);
m.negate();
mp.set(m);
} else if ("Transpose".equals(cmd)) {
mp.get(m);
m.transpose();
mp.set(m);
} else if ("Invert".equals(cmd)) {
mp.get(m);
m.invert();
mp.set(m);
} else if ("Determinant".equals(cmd)) {
mp.get(m);
tf.setText("" + m.determinant());
}
}
}
Programa 2.6: Cdigo que proporciona una interface para visualizar una matriz y realizar diversas
operaciones sobre ella.
60
61
62
en las direcciones
tiene la
63
Las coordenadas
coordenadas
como:
sobe el
64
A pesar de que cualquier rotacin puede ser representada como una matriz de
transformacin, es difcil obtener la matriz de transformacin directamente de las
especificaciones geomtricas de una rotacin general. Por ejemplo, puede ser
fcil el obtener matrices para rotaciones sobre los ejes ,
matriz de rotacin del ngulo
definida por:
Si
La unidad vector
65
es diferente de los
. Los tres angulos son conocidos como los ngulos Euler. La clase
. Los
Programa 2.7: Cdigo que muestra la conversin de un cuaternin a los ngulos Euler.
66
67
Programa 2.8: Cdigo que proporciona la clase que despliega un conjunto de coordenadas.
68
69
70
, seguido por
son
void
mul(Transform3D
t):
multiplica
la
transformacin
con
la
71
void
mulInverse(Transform3D
t1,
Transform3D
t2):
multiplica
la
transformacin t2 de la
derecha.
Cuando se desea establecer una transformacin compleja, es mucho ms sencillo
componerla de transformaciones simples, que construir su matriz directamente.
Supongamos que queremos contruir una rotacin de
(1, 1, 0) y (1, 2, 1). Debido a que los ejes no pasan por el origen, no podemos
aplicar la equacin de cuaterniones directamente. Sin embargo, podemos primero
realizar una traslacin para mover los ejes al origen, realizar la rotacin sobre los
nuevos ejes, y finalmente aplicar la traslacin inversa para enviar los ejes de
regreso a su ubicacin original. Supongamos que
Entonces
es la rotacin de
.Y
sobre los
ejes a travs del origen y (0, 1, 1). Por lo tanto la rotacin original puede ser
descompuesta en
72
posicin estndar,
a
y la
por , entonces la
73
74
75
MODELADO
GEOMTRICO
76
nmeros:
espacio
77
78
79
puntos. Define los vrtices que especifican la relacin estructural entre los
vrtices.
En un objeto del tipo GeometryArray las definiciones para los vrtices siempre
incluyen coordenadas, aunque tambin pueden incluir otro tipo de datos como
superficies normales y colores.
Normalmente un objeto de la familia GeometryArray es creado al llamar al
constructor apropiado con los datos especificados y los tamaos de los arreglos.
Los datos del vrtice son establecidos con llamadas a mtodos. GeometryArray
proporciona una variedad de mtodos para establecer las coordenadas y otros
datos. Por ejemplo, una coordenada puede establecerse individualmente o a
travs de un arreglo de coordenadas:
void setCoordinate(int index, Point3f coord.)
void setCoordinates(int startIndex, Point3f[ ] cords)
La clase PointArray define la geometra consistente de un conjunto de puntos.
Cada vrtice corresponde un punto en la figura. Por ejemplo el siguiente
fragmento de cdigo define tres puntos:
PointArray pa = new PointArray(3, GeometryArray.COORDINATES);
pa.setCoordinate(0, new Point3f(0f, 0f, 0f));
pa.setCoordinate(1, new Point3f(1f, 0f, 0f));
pa.setCoordinate(3, new Point3f(0f, 1f, 0f));
80
81
La geometra de un cono puede estr definido como una serie de tringulos que
utilizan TriangleArray como se muestra en el siguiente fragmento de cdigo:
int n=0; //numero de parches de triangulo
TriangleArray ta = new TriangleArray(3*n,
GeometryArray.COORDINATES);
Point3f apex = new Point3f(0, 0, 1);
Point3f p1 = new Point3f(1, 0,0);
int count = 0;
for (int i=1; i<=n; i++){
float x = (float)Math.cos(i*2*Math.PI/n);
float y = (float)Math.sin(i*2*Math.PI/n);
Point3f p2 = new Point3f(x, y, 0);
ta.setCoordinate(count++, apex);
ta.setCoordinate(count++, p1);
ta.setCoordinate(count++, p2);
p1=p2;
}
La base circular del cono est dividida en
segmento son las puntas que forman el triangulo. Debido a que TriangleArray
requiere de especificaciones explcitas de cada vrtice en cada triangulo, es
necesario definir
puntos distintivos.
82
Cabe mencionar que aunque solo hay seis puntos distintivos en la figura, se
necesitan definir los ocho vrtices del objeto debido a que es necesario
especificar cada figura con cuatro vrtices.
Comnmente los vrtices en un arreglo son compartidos por diversos polgonos
diferentes. Utilizando el TriangleArray o el QuadArray se pueden agregar los
vrtices compartidos mltiples veces. La clase GeometryStripArray usa la idea de
franjas para permitir compartir los vrtices adyacentes. Para definir franjas
separadas, el nmero de vrtices de cada una de ellas debe estr especificado
por un arreglo de enteros:
void setStripVertexCounts(int[ ] stripVertexCounts);
83
LineStripArray:
int[ ] stripVertexCounts = {2, 3};
LineStripArray lsa = new LineStripArray(5, GeometryArray.COORDINATES,
stripVertexCounts);
Point3f[ ] coords = new Point3f[5];
cords[0]= new Point3f(0f, 0f, 0f);
cords[1]= new Point3f(1f, 1f, 0f);
cords[2]= new Point3f(1f, 0f, 0f);
cords[3]= new Point3f(2f, 1f, 0f);
cords[4]= new Point3f(3f, 0f, 0f);
lsa.setCoordinates(0, coords);
La clase TriangleStripArray define franjas de tringulos. En cada franja, cada tres
vrtices consecutivos definen el tringulo, la siguiente figura ilustra una figura
construida utilizando un objeto TriangleStripArray con conteo de franjas de
vrtices (5, 4):
84
85
ocho como se ocupaba con el GeometryArray. Cada figura est especificada por
sus cuatro ndices correspondientes a los vrtices de sus esquinas:
IndexedQuadArray iqa = new IndexedQuadArray(6,
GeometryArray.COORDINATES, 8);
Point3f[ ] coords = new Point3f[6];
cords[0]= new Point3f(0f, 0f, 0f);
cords[1]= new Point3f(1f, 0f, 0f);
cords[2]= new Point3f(1f, 1f, 0f);
cords[ 3]= new Point3f(0f, 1f, 0f);
cords[4]= new Point3f(0f, 1f, 1f);
cords[5]= new Point3f(1f, 1f, 1f);
iqa.setCoordinates(0, coords);
int[ ] indices = {0, 1, 2, 3, 4, 5};
iqa.setCoordinateIndices(0, indices);
Tambien existe
la
86
87
root.addChild(ptlight);
PointLight ptlight2 = new PointLight(new Color3f(Color.orange),
new Point3f(-2f,2f,2f), new Point3f(1f,0f,0f));
ptlight2.setInfluencingBounds(bounds);
root.addChild(ptlight2);
return root;
}
}
88
89
tr.setTranslation(new Vector3f(0f,1.5f,0f));
TransformGroup tgSphere = new TransformGroup(tr);
tg.addChild(tgSphere);
tgSphere.addChild(sphere);
tr.setTranslation(new Vector3f(-1f,-1.5f,0f));
TransformGroup tgCylinder = new TransformGroup(tr);
tg.addChild(tgCylinder);
tgCylinder.addChild(cylinder);
tr.setTranslation(new Vector3f(1f,-1.5f,0f));
TransformGroup tgCone = new TransformGroup(tr);
tg.addChild(tgCone);
tgCone.addChild(cone);
Alpha alpha = new Alpha(-1, 4000);
RotationInterpolator rotator = new RotationInterpolator(alpha, spin);
BoundingSphere bounds = new BoundingSphere();
rotator.setSchedulingBounds(bounds);
spin.addChild(rotator);
//background and light
Background background = new Background(1.0f, 1.0f, 1.0f);
background.setApplicationBounds(bounds);
root.addChild(background);
AmbientLight light = new AmbientLight(true, new Color3f(Color.red));
light.setInfluencingBounds(bounds);
root.addChild(light);
PointLight ptlight = new PointLight(new Color3f(Color.green),
new Point3f(3f,3f,3f), new Point3f(1f,0f,0f));
ptlight.setInfluencingBounds(bounds);
root.addChild(ptlight);
PointLight ptlight2 = new PointLight(new Color3f(Color.orange),
new Point3f(-2f,2f,2f), new Point3f(1f,0f,0f));
ptlight2.setInfluencingBounds(bounds);
root.addChild(ptlight2);
return root;
}
}
Programa 3.3: Cdigo que despliega las cuatro primitivas bsicas en rotacin.
3.2 Proyecciones.
Es posible realizar vistas de una escena 3D con una imagen 2D a travs de una
transformacin llamada proyeccin. Existen dos tipos de proyecciones: la
90
. Entonces un punto
y la proyeccin es en
en el espacio es simplemente
la matriz:
91
y el ojo est en
viendo
92
O lo que es lo mismo:
Similarmente, en la direccin de :
Si la coordenada
93
Esta matriz se
. Mientras que
, el punto de vista se
vistas
son:
ViewPlatform,
View,
PhysicalBody,
PhysicalEnvironment,
Canvas3D, Screen3D.
Un objeto ViewPlatform define la presencia de la vista en un mundo virtual. Este
objeto puede atravesar una cadena de transformaciones y eventualmente ser
adjuntado al objeto del tipo Locale. El TransformGroup define la transformacin de
vista de la plataforma que determina principalmente la posicin y orientacin de la
vista, o la matriz de vista. La clase Transform3D tiene un mtodo que ayuda a
construir la transformacin:
void lookAt(Point3d eye, Point3d look, Vector3d up)
La transformacin es contruida para posicionar el ViewPlatform para que el ojo se
coloque en el punto dado, viendo hacia el centro especificado y con la direccin
dada hacia arriba en la placa de vista. La inversin de la transformacin definida
94
El
95
al
y una relacin de
96
97
98
root.addChild(ptlight);
PointLight ptlight2 = new PointLight(new Color3f(Color.orange),
new Point3f(-2f,2f,2f), new Point3f(1f,0f,0f));
ptlight2.setInfluencingBounds(bounds);
root.addChild(ptlight2);
return root;
}
}
Programa 3.4: Cdigo que muestra un tetraedro y utiliza vistas en modo de compatibilidad.
View,
un
PhysicalEnvironment
objeto
y
un
ViewAvatar,
conjunto
de
un
objeto
objetos
PhysicalBody,
Canvas3D.
El
un
objeto
99
100
101
102
El siguiente cdigo muestra una aplicacin con multiples vistas. El objeto, un texto
3D en rotacin, es renderizado de cuatro diferentes vistas. Una es la vista de
perspectiva estndar poporcionada por SimpleUniverse. Las otras tres son
proyecciones paralelas en las direcciones ,
y .
import javax.vecmath.*;
import java.awt.*;
import java.awt.event.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;
import java.applet.*;
import com.sun.j3d.utils.applet.MainFrame;
public class MultipleViews extends Applet {
public static void main(String[] args) {
new MainFrame(new MultipleViews(), 640, 480);
}
public void init() {
// create 4 Canvas3D objects
this.setLayout(new GridLayout(2,2));
GraphicsConfiguration gc = SimpleUniverse.getPreferredConfiguration();
// first view: standard
Canvas3D cv = new Canvas3D(gc);
add(cv);
SimpleUniverse su = new SimpleUniverse(cv);
su.getViewingPlatform().setNominalViewingTransform();
// second view: x direction
cv = new Canvas3D(gc);
add(cv);
BranchGroup bgView = createView(cv, new Point3d(2.7,0,0),
new Point3d(0,0,0), new Vector3d(0,1,0));
su.addBranchGraph(bgView);
// third view: z direction
cv = new Canvas3D(gc);
add(cv);
bgView = createView(cv, new Point3d(0, 0, 2.7),
new Point3d(0,0,0), new Vector3d(0,1,0));
su.addBranchGraph(bgView);
// fourth view: y direction
cv = new Canvas3D(gc);
add(cv);
bgView = createView(cv, new Point3d(0,2.7,0),
new Point3d(0,0,0), new Vector3d(0,0,1));
su.addBranchGraph(bgView);
// content branch
BranchGroup bg = createSceneGraph();
bg.compile();
su.addBranchGraph(bg);
}
private BranchGroup createView(Canvas3D cv, Point3d eye,
Point3d center, Vector3d vup) {
View view = new View();
view.setProjectionPolicy(View.PARALLEL_PROJECTION);
ViewPlatform vp = new ViewPlatform();
view.addCanvas3D(cv);
view.attachViewPlatform(vp);
view.setPhysicalBody(new PhysicalBody());
view.setPhysicalEnvironment(new PhysicalEnvironment());
Transform3D trans = new Transform3D();
trans.lookAt(eye, center, vup);
trans.invert();
TransformGroup tg = new TransformGroup(trans);
tg.addChild(vp);
BranchGroup bgView = new BranchGroup();
bgView.addChild(tg);
103
return bgView;
}
private BranchGroup createSceneGraph() {
BranchGroup root = new BranchGroup();
TransformGroup spin = new TransformGroup();
spin.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
root.addChild(spin);
// object
Font3D font = new Font3D(new Font("Serif", Font.PLAIN, 1),
new FontExtrusion());
Text3D text = new Text3D(font, "Java");
Appearance ap = new Appearance();
ap.setMaterial(new Material());
Shape3D shape = new Shape3D(text, ap);
Transform3D tr = new Transform3D();
tr.setTranslation(new Vector3f(-1f, -0.25f, 0f));
TransformGroup tg = new TransformGroup(tr);
spin.addChild(tg);
tg.addChild(shape);
// rotator
Alpha alpha = new Alpha(-1, 24000);
RotationInterpolator rotator = new RotationInterpolator(alpha, spin);
BoundingSphere bounds = new BoundingSphere();
rotator.setSchedulingBounds(bounds);
spin.addChild(rotator);
// background and light
Background background = new Background(1.0f, 1.0f, 1.0f);
background.setApplicationBounds(bounds);
root.addChild(background);
AmbientLight light = new AmbientLight(true, new Color3f(Color.red));
light.setInfluencingBounds(bounds);
root.addChild(light);
PointLight ptlight = new PointLight(new Color3f(Color.green),
new Point3f(3f,3f,3f), new Point3f(1f,0f,0f));
ptlight.setInfluencingBounds(bounds);
root.addChild(ptlight);
PointLight ptlight2 = new PointLight(new Color3f(Color.orange),
new Point3f(-2f,2f,2f), new Point3f(1f,0f,0f));
ptlight2.setInfluencingBounds(bounds);
root.addChild(ptlight2);
return root;
}
}
104
105
106
}
GeometryInfo gi = new GeometryInfo(qa);
NormalGenerator ng = new NormalGenerator();
ng.generateNormals(gi);
return gi.getGeometryArray();
}
Programa 3.7: Cdigo que muestra un mtodo que toma un objeto 2D y le aplica una extrusin.
Dados un cojunto de puntos para la curva; para crear la superficie en rotacin con
franjas, se puede rotar a un ngulo
107
double s = Math.sin(theta);
double[] mat = {c, -s, 0, r2*(1-c),
s, c, 0, -r2*s,
0, 0, 1, 0,
0, 0, 0, 1};
Transform3D rot1 = new Transform3D(mat);
for (int i = 1; i < m; i++) {
pts[i] = new Point3d();
rot1.transform(pts[i-1], pts[i]);
}
Transform3D rot2 = new Transform3D();
rot2.rotY(2.0*Math.PI/n);
IndexedQuadArray qa = new IndexedQuadArray(m*n,
IndexedQuadArray.COORDINATES, 4*m*n);
int quadIndex = 0;
for (int i = 0; i < n; i++) {
qa.setCoordinates(i*m, pts);
for (int j = 0; j < m; j++) {
rot2.transform(pts[j]);
int[] quadCoords = {i*m+j, ((i+1)%n)*m+j,
((i+1)%n)*m+((j+1)%m), i*m+((j+1)%m)};
qa.setCoordinateIndices(quadIndex, quadCoords);
quadIndex += 4;
}
}
GeometryInfo gi = new GeometryInfo(qa);
NormalGenerator ng = new NormalGenerator();
ng.generateNormals(gi);
this.setGeometry(gi.getGeometryArray());
}
}
Programa 3.8: Cdigo que muestra la construccin de un toro va dos rotaciones diferentes.
El siguiente cdigo despliega dos toros. Los vrtices de los toros son generados
con transformaciones y se encuentran rotando en el espacio.
import javax.vecmath.*;
import java.awt.*;
import java.awt.event.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;
import java.applet.*;
import com.sun.j3d.utils.applet.MainFrame;
public class TestTorus extends Applet {
public static void main(String[] args) {
new MainFrame(new TestTorus(), 640, 480);
}
public void init() {
// create canvas
GraphicsConfiguration gc = SimpleUniverse.getPreferredConfiguration();
Canvas3D cv = new Canvas3D(gc);
setLayout(new BorderLayout());
add(cv, BorderLayout.CENTER);
BranchGroup bg = createSceneGraph();
bg.compile();
SimpleUniverse su = new SimpleUniverse(cv);
su.getViewingPlatform().setNominalViewingTransform();
su.addBranchGraph(bg);
}
private BranchGroup createSceneGraph() {
BranchGroup root = new BranchGroup();
TransformGroup spin = new TransformGroup();
spin.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
root.addChild(spin);
108
Programa 3.9: Cdigo que despliega dos toros generados con transformaciones.
109
Programa 3.10: Cdigo que despliega una flecha ilustrando la combinacin de transformaciones.
110
111
spin.addChild(tg);
//rotation
Alpha alpha = new Alpha(-1, 8000);
RotationInterpolator rotator = new RotationInterpolator(alpha, spin);
BoundingSphere bounds = new BoundingSphere();
rotator.setSchedulingBounds(bounds);
spin.addChild(rotator);
//background and lights
Background background = new Background(1.0f, 1.0f, 1.0f);
background.setApplicationBounds(bounds);
root.addChild(background);
AmbientLight light = new AmbientLight(true, new Color3f(Color.red));
light.setInfluencingBounds(bounds);
root.addChild(light);
PointLight ptlight = new PointLight(new Color3f(Color.white),
new Point3f(2f,2f,2f), new Point3f(1f,0f,0f));
ptlight.setInfluencingBounds(bounds);
root.addChild(ptlight);
return root;
}
}
computadora.
Las curvas cuadrticas y curvas cbicas soportadas en Java 2D son casos
especiales de curvas Bzier con grados de
, repectivamente. Sus
112
Una curva B-spline est definida por una secuencia de puntos de control; sigue
direcciones generales de dichos puntos, pero no necesariamente necesita
interpolar los puntos. Una curva general B-spline con grado
con puntos de control
. La ecuacin paramtrica
. Las funciones
De otra manera:
, la curva se
conoce como B-spline uniforme; en general, las curvas B-spline no son uniformes.
La formulacin de B-spline puede tambin aplicarse a coordenadas homogneas
en la misma combinacin de funciones para los componentes
. Cuando un punto
113
En las curvas B-spline los nodos estn uniformemente distribudos, excepto los
primeros cuatro y los ltimos cuatro nodos que se establecen para que sean
iguales:
Los nodos duplicados ocasionarn que los primeros y ltimos puntos de control
sean interpolados por la curva, similar a lo que ocurre con una curva Bzier. De
hecho si
regular Bzier:
. La ecuacin
, la
cada segmento puede ser convertido a una curva cbica Bzier. Si los puntos
114
115
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JApplet applet = new BSpline();
applet.init();
frame.getContentPane().add(applet);
frame.pack();
frame.setVisible(true);
}
public void init() {
JPanel panel = new BSplinePanel();
getContentPane().add(panel);
}
}
class BSplinePanel extends JPanel implements MouseListener, MouseMotionListener {
Vector points = null;
boolean completed = true;
public BSplinePanel() {
setPreferredSize(new Dimension(640, 480));
setBackground(Color.white);
addMouseListener(this);
addMouseMotionListener(this);
points = new Vector();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
Point p0 = null;
Point p1 = null;
Point p2 = null;
Point p3 = null;
float x1,y1,x2,y2,x3,y3, x4, y4;
Iterator it = points.iterator();
if (it.hasNext()) {
p1 = (Point)(it.next());
}
while (it.hasNext()) {
p2 = (Point)(it.next());
g2.drawLine(p1.x, p1.y, p2.x, p2.y);
p1 = p2;
}
GeneralPath spline = new GeneralPath();
int n = points.size();
if (n == 0) return;
p1 = (Point)points.get(0);
spline.moveTo(p1.x, p1.y);
g2.drawRect(p1.x-3, p1.y-3, 6, 6);
p1 = (Point)points.get(1);
p2 = (Point)points.get(2);
p3 = (Point)points.get(3);
x1 = p1.x;
y1 = p1.y;
x2 = (p1.x + p2.x)/2.0f;
y2 = (p1.y + p2.y)/2.0f;
x4 = (2.0f*p2.x+p3.x)/3.0f;
y4 = (2.0f*p2.y+p3.y)/3.0f;
x3 = (x2+x4)/2.0f;
y3 = (y2+y4)/2.0f;
spline.curveTo(x1, y1, x2, y2, x3, y3);
g2.drawRect((int)x1-3, (int)y1-3, 6, 6);
g2.drawRect((int)x2-3, (int)y2-3, 6, 6);
g2.drawRect((int)x3-3, (int)y3-3, 6, 6);
for (int i = 2; i < n - 4; i++) {
p1 = p2;
p2 = p3;
p3 = (Point)points.get(i+2);
x1 = x4;
y1 = y4;
x2 = (p1.x+2.0f*p2.x)/3.0f;
y2 = (p1.y+2.0f*p2.y)/3.0f;
x4 = (2.0f*p2.x+p3.x)/3.0f;
116
y4 = (2.0f*p2.y+p3.y)/3.0f;
x3 = (x2+x4)/2.0f;
y3 = (y2+y4)/2.0f;
spline.curveTo(x1,y1,x2,y2,x3,y3);
g2.drawRect((int)x1-3, (int)y1-3, 6, 6);
g2.drawRect((int)x2-3, (int)y2-3, 6, 6);
g2.drawRect((int)x3-3, (int)y3-3, 6, 6);
}
p1 = p2;
p2 = p3;
p3 = (Point)points.get(n-2);
x1 = x4;
y1 = y4;
x2 = (p1.x+2.0f*p2.x)/3.0f;
y2 = (p1.y+2.0f*p2.y)/3.0f;
x4 = (p2.x+p3.x)/2.0f;
y4 = (p2.y+p3.y)/2.0f;
x3 = (x2+x4)/2.0f;
y3 = (y2+y4)/2.0f;
spline.curveTo(x1,y1,x2,y2,x3,y3);
g2.drawRect((int)x1-3, (int)y1-3, 6, 6);
g2.drawRect((int)x2-3, (int)y2-3, 6, 6);
g2.drawRect((int)x3-3, (int)y3-3, 6, 6);
p2 = p3;
p3 = (Point)points.get(n-1);
x1 = x4;
y1 = y4;
x2 = p2.x;
y2 = p2.y;
x3 = p3.x;
y3 = p3.y;
spline.curveTo(x1,y1,x2,y2,x3,y3);
g2.drawRect((int)x1-3, (int)y1-3, 6, 6);
g2.drawRect((int)x2-3, (int)y2-3, 6, 6);
g2.drawRect((int)x3-3, (int)y3-3, 6, 6);
g2.draw(spline);
}
public void mouseClicked(MouseEvent ev) {
}
public void mouseEntered(MouseEvent ev) {
}
public void mouseExited(MouseEvent ev) {
}
public void mousePressed(MouseEvent ev) {
Graphics g = getGraphics();
if (completed) {
points.clear();
completed = false;
}
if (ev.getClickCount() == 1) {
Point p =ev.getPoint();
points.add(p);
g.fillOval(p.x-3, p.y-3, 6, 6);
}
}
public void mouseReleased(MouseEvent ev) {
if (ev.getClickCount() > 1) {
completed = true;
repaint();
}
}
public void mouseMoved(MouseEvent ev) {
}
public void mouseDragged(MouseEvent ev) {
}
}
117
Donde
con puntos
control:
118
La primera fila contiene los puntos originales de control de la curva Bzier. Las
filas subsecuentes son calculadas con la frmula:
Una curva Bzier puede ser subdividida en dos curvas Bzier. El algoritmo
deCasteljau tambin ofrece un mtodo para la subdivisin. En la figura anterior,
dos curvas Bzier subdivididas tienen los puntos de control
respectivamente.
Versiones actuales de la API Java 3D no incluye soporte directo para curvas y
superficies de curvas. Se implementarn las propias versiones de curvas Bzier y
superficies utilizando los arreglos de lnea y polgonos porporcionados por Java
3D. Otras curvas spline y superficies pueden ser implementadoas como series de
curvas y superficies Bzier.
El siguiente ejemplo muestra una curva cbica Bzier con sus subdivisiones
recursivas.
119
import javax.vecmath.*;
import java.awt.*;
import java.awt.event.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;
public class BezierCurve extends LineStripArray {
static int level = 4;
static int[] vCnts = {(1<<level)+1};
int index = 0;
public BezierCurve(Point3d p0,Point3d p1,Point3d p2,Point3d p3) {
super(vCnts[0], GeometryArray.COORDINATES, vCnts);
setCoordinate(index, p0);
index++;
subdivide(0,p0,p1,p2,p3);
}
void subdivide(int lev, Point3d p0, Point3d p1, Point3d p2, Point3d p3) {
if (lev >= level){
setCoordinate(index, p3);
index++;
}
else {
Point3d p10 = new Point3d();
p10.add(p0,p1);
p10.scale(0.5);
Point3d p11 = new Point3d();
p11.add(p1,p2);
p11.scale(0.5);
Point3d p12 = new Point3d();
p12.add(p2,p3);
p12.scale(0.5);
Point3d p20 = new Point3d();
p20.add(p10,p11);
p20.scale(0.5);
Point3d p21 = new Point3d();
p21.add(p11,p12);
p21.scale(0.5);
Point3d p30 = new Point3d();
p30.add(p20,p21);
p30.scale(0.5);
subdivide(lev+1,p0,p10,p20,p30);
subdivide(lev+1,p30,p21,p12,p3);
}
}
}
Programa 3.13: Cdigo que muestra una curva Bzier con sus divisiones recursivas.
120
121
La
ecuacin paramtrica de una superfice de una superficie Bzier est dada por:
La evaluacin de un punto
obtenida del algoritmo deCasteljau. Una superficie Bzier puede ser vista como
una familia de curvas Bzier. Para una
fija, la curva
es una curva
Los cuatro puntos de control son cada uno otra curva Bzier. Consecuentemente
estos puntos pueden ser calculados a travs de cuatro aplicaciones del algoritmo
deCasteljau con
, de otra
en la curva.
122
double v = 0;
for (int i = 0; i < m; i++) {
for (int k = 0; k < 4; k++) {
p[k] = deCasteljau(u, ctrlPts[k]);
}
v = 0;
for (int j = 0; j < n; j++) {
pts[idx++] = deCasteljau(v, p);
v += dv;
}
u += du;
}
int[] coords = new int[2*n*(m-1)];
idx = 0;
for (int i = 1; i < m; i++) {
for (int j = 0; j < n; j++) {
coords[idx++] = i*n + j;
coords[idx++] = (i-1)*n + j;
}
}
int[] stripCounts = new int[m-1];
for (int i = 0; i < m-1; i++) stripCounts[i] = 2*n;
GeometryInfo gi = new GeometryInfo(GeometryInfo.TRIANGLE_STRIP_ARRAY);
gi.setCoordinates(pts);
gi.setCoordinateIndices(coords);
gi.setStripCounts(stripCounts);
NormalGenerator ng = new NormalGenerator();
ng.generateNormals(gi);
this.setGeometry(gi.getGeometryArray());
}
Point3d deCasteljau(double t, Point3d[] p) {
Point3d[] pt = {new Point3d(p[0]),new Point3d(p[1]),new Point3d(p[2]), new Point3d(p[3])};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3-i; j++) {
pt[j].interpolate(pt[j+1], t);
}
}
return pt[0];
}
}
123
Programa 3.16: Cdigo que muestra una superficie Bzier generada aleatoriamente.
124
ANEXOS
125
Preguntas de Unidad 1:
1. Lista tres aplicaciones que utilicen grficos por computadora en 2D.
2. Nombra una aplicacin (que no sea un juego) que utilice grficos por
computadora en 3D.
3. Busca en internet y escribe una lista de pelculas que han aplicado la
graficacin por computadora.
4. Identifica los campos (graficacin por computadora, procesamiento de
imgenes, y visin por computadora) que se relacionan con las siguientes
aplicaciones:
a. Localizacin de puntos brillantes en una imagen de una mamografa.
b. Construir un modelo en 3D de un edificio a travs un conjunto de sus
imgenes.
c. Mostrar una simulacin del sistema solar con el sol y los planetas en
movimiento.
d. Reconocer una parte del cerebro en un escaneo por MRI y mostrar
un modelo en 3D del cerebro.
e. Utilizar computadoras para generar una escena de un choque
automovilstico.
f. Realizar una identificacin por computadora de una persona a partir
de su fotografa.
5. Busca en internet un ejemplo de un programa que utilice GKS.
6. Busca en internet un ejemplo de un programa que utilice PHIGS.
7. Compara OpenGL con Java 3D y haz una lista de ventajas para cada API.
8. Discute las ventajas y desventajas de incluir soporte grfico en una
plataforma de lenguaje estndar como Java.
9. Haz una lista de los componentes GUI ms importantes de AWT y
encuentra sus equivalentes (ms aproximados) en Swing.
10. Lee la documentacin de Java 3D y haz una lista de paquetes de Java en
Java 3D.
126
Ejercicios de Unidad 1:
1. Escribe un programa en Java (por consola) que llene un arreglo double con
100 nmeros aleatorios e imprima la media y la desviacin estndar.
2. Escribe un programa en AWT que dibuje un crculo en medio de la ventana.
3. Escribe un programa en Swing que dibuje un crculo en medio de la
ventana.
4. Escribe un programa que permita al usuario arrastrar un crculo relleno en
determinada posicin indicada por el mouse.
5. Escribe, compila y corre el programa en Java 2D presentado en la pgina
25.
6. Escribe, compila y corre el programa en Java 3D presentado en la pgina
26.
127
Preguntas de Unidad 2:
1. Cules son las diferencias entre transformaciones de objeto y
transformaciones de vista?
2. Grafica los siguientes puntos en un sistema de coordenadas 2D:
(1, 3), (-2, 1.5), (0,-2), (0, 0)
3. Encuentra las coordenadas de los vrtices del siguiente tringulo:
posible
transformar
una
elipse
en
un
crculo
utilizando
transformaciones afines?
9. Es posible transformar un trapezoide a un cuadrado utilizando
transformaciones afines?
10. Cul es la inversa de una rotacin del un ngulo
sobre el origen?
a un eje
y uno
uno .
12. Encuentra la matriz de transformacin para la rotacin de un ngulo
sobre los puntos
128
con un
factor de 0.5.
16. Encuentra la matriz de transformacin para la composicin de rotacin de
sobre el origen y una refleccin sobre la lnea
17. Si los valores RGB y
valores del pixel destino son 0.2, 1.0, 0.5 y 0.6, encuentra el valor RGB y el
valor de
por
30.
21. Encuentra la matriz de transformacin de la refleccin sobre el plano a
travs del origen con el vector normal (1, 1, 1).
22. Deriva la matriz de transformacin de la refleccin sobre el plano a travs
del origen con un vector normal
al eje
al eje ; y
al el eje .
, deriva la
por los
129
ngulo.
Ejercicios de Unidad 2:
1. Escribe un programa que grafique las siguientes ecuaciones paramtricas:
. El
130
factores
15. Modifica el cdigo del programa de la pgina 68, para incluir una rotacin
con ngulos Euler.
16. Modifica el cdigo del programa de la pgina 74, para construir una matriz
de refleccin directamente de la siguiente frmula:
131
Preguntas de Unidad 3:
1. Construye un objeto PointArray para los vrtices de un cubo centrados en
el origen.
2. Construye un objeto LineArray para las orillas de un tetraedro.
3. Utiliza un objeto TriangleArray para representar un tetraedro.
4. Construye un objeto QuadArray para representar un cubo.
5. Construye un objeto LineStripArray para las orillas de un tetraedro
6. Construye un objeto TriangleStripArray para representar un tetraedro.
7. Construye un objeto TriangleFanArray para representar un tetraedro.
8. Utiliza un objeto IndexedQuadArray para representar un cubo.
9. Dibuja la figura correspondiente al siguiente objeto TriangleStripArray:
int[ ] stripVertexCounts = {5, 3};
TriangleStripArray tsa = new TriangleStripArray (8, GeometryArray.COORDINATES,
stripVertexCounts);
Point3f[ ] coords = new Point3f[8];
cords[0]= new Point3f(0f, 0f, 0f);
cords[1]= new Point3f(0f, 1f, 0f);
cords[2]= new Point3f(0.5f, 0.866f, 0f);
cords[3]= new Point3f(1.5f, 0.866f, 0f);
cords[4]= new Point3f(1f, 1.73f, 0f);
cords[5]= new Point3f(0f, 1f, 0f);
cords[6]= new Point3f(1.5f, 0.866f, 0f);
cords[7]= new Point3f(2f, 0f, 0f);
tsa.setCoordinates(0, coords);
11. Dibuja
una
figura
que
corresponda
al
siguiente
objeto
de
IndexedTriangleStripArray:
int[ ] stripIndexCounts = {5, 3};
132
NOTA:
es
la
transformacin
exacta
realizada
por
setNominalViewTransform().
13. Deriva la matriz de la proyeccin paralela sobre la direccin (1, 0, 1) en el
plano
133
Ejercicios de Unidad 3:
1. El octaedro es uno de los cinco slidos platnicos. Tiene ocho caras en
forma de tringulos y seis vrtices:
134
135
. Coloca la vista en
y con el eje
en posicin hacia
arriba. La otra vista estar posicionada en (0, 0, -2) viendo sobre el eje
con el eje negativo en
y con el eje
,y
. Coloca un texto en 3D y
136
UNIDAD 1
Figura 1.1: Tareas principales de la graficacin por computadora:
13
16
18
20
21
26
28
UNIDAD 2
Figura 2.1 Un objeto grfico en 2D es procesado para su transformacin
31
y su vista.
137
33
Figura 2.3 Lnea que pude ser representada por una ecuacin lineal.
33
34
36
37
37
38
38
39
45
48
50
52
54
61
71
75
UNIDAD 3
Figura 3.1: Esfera representada por mallas de tringulos de diferentes
79
resoluciones.
Figura 3.2: Jerarqua de clases de Geometry.
79
80
81
82
83
84
85
88
88
90
138
91
92
93
99
102
104
107
109
112
118
119
121
124
UNIDAD 1
Programa 1.1: Cdigo en ensamblador que muestra un crculo.
11
14
17
19
Programa 1.5: Cdigo utilizando OpenGL que muestra una esfera 3D.
20
Programa 1.6: Cdigo utilizando JOGL que muestra una esfera 3D.
23
25
26
en rotacin y texto.
UNIDAD 2
Programa 2.1: Cdigo que muestra efectos de las transformaciones
42
afines.
139
48
51
53
Programa 2.5: Cdigo que proporciona una clase que despliega una
59
matriz.
Programa 2.6: Cdigo que proporciona una interface para visualizar una
59
66
ngulos Euler.
Programa 2.8: Cdigo que proporciona la clase que despliega un
67
conjunto de coordenadas.
Programa 2.9: Cdigo que muestra las caractersticas de la clase
68
Transform3D.
Programa 2.10: Cdigo que muestra la construccin de reflecciones.
74
UNIDAD 3
Programa 3.1: Cdigo que construye un tetraedro regular.
86
87
90
rotacin.
Programa 3.4: Cdigo que muestra un tetraedro y utiliza vistas en modo
97
de compatibilidad.
Programa 3.5: Cdigo que muestra un dodecaedro.
100
103
106
107
rotaciones diferentes.
Programa 3.9: Cdigo que despliega dos toros generados con
108
transformaciones.
Programa 3.10: Cdigo que despliega una flecha ilustrando la
110
combinacin de transformaciones.
Programa 3.11: Cdigo que despliega una figura en 3D.
110
140
115
Programa 3.13: Cdigo que muestra una curva Bzier con sus divisiones
120
recursivas.
Programa 3.14: Cdigo que despliega una curva Bzier.
120
122
123
aleatoriamente.
UNIDAD 1
Tabla 1.1: Programacin grfica en diferentes niveles.
10
22
UNIDAD 2
Tabla 2.1 Las 12 reglas de composicin Porter Duff
50
141
GLOSARIO
A
Algoritmo deCasteljau: mtodo para calcular un punto en una curva
Bzier a travs de una serie de interpolaciones lineales.
ngulos Euler: mtodo que especifica rotaciones 3D con tres rotaciones
sobre los ejes de las coordenadas principales.
API: Interface de Aplicacin del Programador. Una interface de software
estandarizada que especifica el uso de funcionalidades proporcionadas por
un paquete de software.
Avatar: identidad representada grficamente que adopta un usuario.
AWT: Abstract Window Toolkt. Un paquete grfico de Java existente desde
las primeras versions del API de Java.
Azimut: arco del horizonte medido entre un punto fijo y el crculo vertical
que pasa por el centro de un objeto en el cielo o en la tierra.
142
C
Centro de vista: una ubicacin centrada que define la direccin en donde
el ojo est posicionado.
Cuaternin: es una extensin de los nmeros reales, similar a la de los
nmeros complejos. Mientras que los nmeros complejos son una
extensin de los reales por la adicin de la unidad imaginaria , tal que
, los cuaterniones son una extensin generada de manera
anloga aadiendo las unidades imaginarias: , y
tal que
F
FOV: campo de vista. Un ngulo para la porcin visible de una vista.
143
G
GKS: Sistema de Kernel Grfico (Graphics Kernel System). Una API de
estndar grfico.
J
JOGL: Un lenguaje de cubierta en Java para OpenGL.
M
Malla de polgono: conjunto de polgonos simples como los tringulos que
representan una aproximacin de una superficie.
Matriz de proyeccin: matriz que define un volumen de vista.
Matriz de transformacin 3D: matriz que representa una transformacin
proyectiva 3D.
Matriz de vista: matriz que define la ubicacin y orientacin de una vista
en un espacio virtual.
Modelado: el proceso de construir un modelo grfico.
Modelo de compatibilidad: un modo de vista especial de Java 3D que es
compatible con las vistas tradicionales de OpenGL.
Mundo virtual: modelo grfico construido en una computadora.
N
NURBS: B-spline no uniforme y racional.
144
P
PHIGS: Programmers Hierarchical Interactive Graphics System. Una API
grfica.
Plano frontal de recorte: el plano fontral de una vista frustum.
Plano posterior de recorte: plano posterior de una vista frustum.
Polinomio Bernstein: (base de Bernstein) un polinomio especial
frecuentemente utilizado en aproximacin.
POO: Programacin Orientada a Objetos. Un paradigma de ingeniera de
software que
interrelacionados.
Primitiva: objeto visual que puede ser utilizado para construir un modelo.
Procesamiento de imgenes: campo de la ingeniera elctrica y las
ciencias
de
la
computacin
para
estudiar
el
procesamiento
por
R
Refleccin: transformacin geomtrica que voltea los puntos sobre un
plano fijo.
Reglas Porter-Duff: mtodo que crea nuevas figuras geomtricas al
utilizar un conjunto de operaciones tales como unin e interseccin de las
reas de las figuras existentes.
Relacin de aspecto: es la proporcin de una imagen entre su anchura y
su altura.
145
S
Sesgacin:
transformacin
geomtrica
que
mueve
los
puntos
paralelamente a un plano.
Sistema de coordenadas: mtodo para asociar puntos geomtricos con
cantidades algebraicas de tuplas ordenadas por nmeros.
Slidos platnicos: representa los cinco poliedros regulares: tetraedro,
cubo, octaedro, dodecaedro e icosaedro.
Superficie Bzier: superficie de polinomio paramtrico definido por una
rejilla o cuadrcula de puntos de control.
Swing: paquete de grficos para Java relativamente nuevo y mejorado.
T
Toro: es la superficie de revolucin engendrada por una circunferencia que
gira alrededor de una recta fija de su plano, que no la corta. Proviene del
vocablo en latn torus, el cual significa "bulto", ya sea "volumen o tamao
de una cosa" o "elevacin de una superficie causada por una
protuberancia". Un toro slido es un objeto tridimensional construido
mediante el producto cartesiano de un disco y un crculo.
Transformacin afn: transformacin que preserva el paralelismo.
Transformacin
de
composicin:
combinacin
de
dos
ms
146
V
Vector: un elemento geomtrico para una cantidad direccional.
Visin por computadora: campo de la ingeniera y la computacin que
estudia la percepcin y reconstruccin de una escena de imgenes
capturadas.
Vista en direccin hacia arriba: direccin que es considerada hacia arriba
de la perspectiva del espectador.
Volumen de vista: porcin de un espacio virtual que presenta la visibilidad
de una vista.
VRP: punto de referencia, ojo o punto de vista. Es un punto que representa
la posicin del ojo o el centro de una proyeccin.
BIBLIOGRAFA
H. Sowizral, K.Rushforth, M. Deering, The Java 3D API Specification. (2nda Ed.)
(2000). Reading, EEUU: Addison-Wesley.
H. Zhang, D. Liang. Computer Graphics using JAVA 2D and 3D. (2007). Upper
Saddle River, EEUU: Pearson Prentice Hall.
J.Foley, A. Van Dam, S. Feiner, J.Hughs, R. Phillips. Introduction to Computer
Graphics. (1994). Reading, EEUU: Addison-Wesley.
L. Ammeraal. Computer Graphics for JAVA programmers. (1998). New York,
EEUU: Wiley.
R. Parent. Computer Animation Algorithms and Techniques. (2002). San
Francisco, EEUU: Morgan Kaufmann.
Enlaces de Internet:
147
http://opengl.org
http://jogl.dev.java.net
http://java.sun.com
http://java.sun.com/products/java-media/3D/index.jsp
http://j3d.org
https://java3d.dev.java.net/
148