GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro...

103
GRAFICACI GRAFICACI Ó Ó N N Unidad I Unidad I Catedr Catedr á á tico: Hilario Salazar tico: Hilario Salazar Mart Mart í í nez nez OBJETIVO ESPECIFICO: El alumno aprenderá a relacionar los conceptos básicos de geometría analítica con los conceptos iniciales de graficado por computadora

Transcript of GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro...

Page 1: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

GRAFICACIGRAFICACIÓÓNNUnidad IUnidad I

CatedrCatedráático: Hilario Salazar tico: Hilario Salazar MartMartííneznez

OBJETIVO ESPECIFICO:

El alumno aprenderá a relacionar los conceptos básicos de geometría analítica con los conceptos iniciales de graficado por computadora

Page 2: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 3: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 4: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 5: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 6: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 7: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 8: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

1.1 COORDENADAS DEL MUNDO REAL, VENTANA Y RECUADRO

Page 9: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 10: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

ENTIDADES DE DIBUJO• LINEA: Segmento rectilíneo delimitado por sus puntos extremos.

• POLILÍNEA: Curva quebrada y/o mixtilinea, formada por segmentos rectilíneos y/o curvilíneos.

• ARCOS: Segmento de circunferencia.

• CURVA CÓNICA: Se denomina asi a la intercepción de una superficie conica de segundo grado con un plano.

• CURVAS LIBRES. Son curvas simples o compuestas sujetas a una o varias ecuaciones (Las mas conocidas son splines y las Nurbs). Se denominan libres porque el diseñador puede modificar simplemente con desplazar o suprimir uno o mas puntos de control o incluso añadir nuevos.

Page 11: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 12: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

1.2 Graficación de primitivas: rectas y arcos

Rectas horizontales y verticales.Las rectas mas fáciles son las verticales y las horizontales.• Para trazar una línea horizontal desde

P0 (Xinicial,y) P1(Xfinal,y) donde Xinicial ≤ XfinalSe obtiene manteniendo constante el valor de y e incrementado el valor de x

• Para trazar una línea vertical el valor de x permanece fijo y el valor de yvaria.

Recta horizontal

Page 13: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Rectas arbitrariasEl trazado de rectas con pendiente arbitrarias dan origen a ciertos problemas:

1. La pantalla de presentación puede iluminarse solo en posición de píxeles.

2. La presentación por barrido tiene un efecto de escalera que reproduce solo aproximadamente la recta real.

Por ejemplo el pixel de la posición A es una mejor selección que el de la posición B, Segundo, la determinación de los pixeles mas cercanos a la recta no es tare a facil, los diferentes algoritmos calculan pixeles distintos para obtener la aproximación de la recta.

Page 14: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Es un procedimiento de trazado de rectas que es fácil de programar y que produce rectas razonablemente buenas.Supóngase, modo de ejemplo, deseamos trazar un segmento de recta con puntos extremos P0( xinicial,yinicial) y P1(xfinal,yfinal) con una pendiente de

Cualquiera dos puntos consecutivos (x1,y1), (x2,y2) en la recta cumple con la ec. 2.1:

Para abs(m)<1 y xinicial<xfinal la liena se genera incrementando una entidad el valor anterior de x hasta llegar x final, resolviendo y en cada paso. (Si xinicial>xfinal) se intercambian ambos puntos) asi para cada par de puntos consecutivos

Al sustituir esta diferencia en la ec. 2.1 se obtiene

Analizador diferencial digital simple (ADD Simple)

Page 15: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

La ec. 2-2 permite calcular valores consecutivos de y desde el valor anterior remplazando la multiplicación repetida con sumas en punto flotante. Este método de obtención de valor actual que agrega una constante al valor previo es unejemplo de calculo incremental.

Si abs(m)>1 y yinicial<yfinal, recta se general invirtiendo el procedimiento. Esto es, se incrementa el valor de y en una unidad hasta que se alcanza el valor de yfinal y se resuelve x. (Si yinicial>yfinal, se intercambian ambos extremos). Para puntos consecutivos

La ec. 2.3 es la ecuación incremental de la recta,

Page 16: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Ejemplo: programas-ejemplos\add-s.exe

Page 17: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

ADD entero

El ADD simple presenta presenta el inconveniente de emplear dos operaciones que resultan costosas en el tiempo de computación: La adición en punto flotante y la función round.

La idea básica del ADD entero consiste en remplazar la pendiente real valuada por sus componentes enteros.

delta_y=yfinal-yinicialdelta_x=xfinal_xinicial

El algoritmo se divide en cuatro casos que dependen de la pendiente de la recta. Cada caso tiene su propio conjunto de reglas. El error indica la distancia que media entre la recta y un punto graficado.

Page 18: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Po(x,y) y Pf(xfinal,yfinal)

Algoritmo ADD enterodelta_y=yfinal-ydelta_x=xfinal-xm=(yfinal-y)/(xfinal-x)si delta_y<0

permutar(x’s,y’s)delta_y=- delta_ydelta_x=- delta_x

error=0si 0 ≤m ≤1 y delta_x>0 y delta_y >0

/*caso 1*/si error<0

x=x+1y=y+1dibujar(x,y)error=error+delta_y

si error>0x=x+1y=y+1

dibujar(x,y)error=error+delta_y-delta_x

Page 19: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

si m>1 y delta_x>0 y delta_y >0/* caso 2*/

si error<0x=x+1y=y+1dibujar(x,y)error=error+delta_y-delta_x

si no y=y+1dibujar(x,y)error=error-delta_x

si -1 ≤ m ≤0 y delta_x<0 y delta_y >0/*caso 3*/

si error<0x=x-1

dibujar(x,y)error=error+delta_y

si nox=x-1y=y+1

dibujar(x,y)error=error+delta_x+delta_y

Page 20: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

si m <-1 y delta_x<0 y delta_y >0/*caso 4*/

si error<0x=x-1y=y+1

dibujar(x,y)error=error+delta_x+delta_y

si noy=y+1dibujar(x,y)error=error+delta_x

dibujar(xfinal,yfinal)

Page 21: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

ejemplo ADD entero Acceso directo a add-e

Page 22: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Graficación de primitivas: rectas y arcos

Rectas horizontales y verticales.Las rectas mas fáciles son las verticales y las horizontales.• Para trazar una línea horizontal desde

P0 (Xinicial,y) P1(Xfinal,y) donde Xinicial ≤ XfinalSe obtiene manteniendo constante el valor de y e incrementado el valor de x

• Para trazar una línea vertical el valor de x permanece fijo y el valor de yvaria.

Recta horizontal

Page 23: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

INTRODUCCIÓN A LA PROGRAMACION CON OPENGL

• OpenGL.DLL.- La podemos encontrar con el nombre de OpenGL32.DLL (para el caso de S.O de 32 bits) o bien simplemente como GL.DLL. Esta es la librería principal, que contiene la mayoría de las funciones que aquíutilizaremos. Las funciones contenidas en esta librería inician con la letra gl.

• GLU.DLL.- También la podemos encontrar como GLU32.DLL. Contiene funciones para objetos comunes a dibujar como esfera, donas, cilindros, cubos, en fin, varias figuras ya predefinidas que pueden a llegar a ser útiles en ciertos casos, así como funciones para el manejo de la cámara entre otras muchas otras. Podremos identificar la funciones que pertenecen a esta librería porque llevan atepuestas en su nombre las siglas glu.

• GLUT.DLL.- Esta también permite crear objetos complejos como GLU, aunque la principal funcion de esta librería es permitir que los programas se vuelvan interactivos, o sea que posibilita la libre creación de ventanas, así como el acceso al raton y al teclado.

Como funciona OpenGL?OpenGL funciona a través de una serie de librerías DLL que suelen tener varios nombres, pero a fin de cuentas cubren funciones muy especificas y son muy sencillas de identificar, ahora veremos cuales son estas:

Page 24: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

• Otro componente es el llamado Frame Buffer, que no es otra cosa que el área de memoria donde se construyen los gráficos antes de mostrarlos al usuario, es decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía su contenido a la pantalla una vez que la escena esta completamente construida.

Page 25: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Tipos en OpenGL

Debemos recordar que las librerías de OpenGL fueron escritas originalmente en C, asi que conservan muchas características de este lenguaje, entre ellas, la estructura de sus procedimientos y los tipos que se utilizan.Los tipos de OpenGL se anteponen las siglas GL, esto guarda una marcada equivalencia con los tipos genéricos de C,

Ejem.:

Tamaño Correspondencia en C Definición en OpenGL8-bit integer signed char GLbyte16-bit integer short GLshort32-bit integer int or long GLint, GLsizei32-bit floating-point float GLfloat, GLclampf64-bit floating-point double GLdouble, GLclampd8-bit unsigned integer unsigned char GLubyte, GLboolean16-bit unsigned integer unsigned short GLushort32-bit unsigned integer unsigned int or unsigned long GLuint, GLenum, GLbitfield

Usaremos: a) glVertex3f(0.0,0.0,0.0) ; b) Glfloat vertice[3]={0.0,0.0,0.0};

glVertexfv(vertice);

Ambas funciones crean un vertice situado en el origen de cordenadas del mundo, es decir x=y=z=0.0en a) termia en 3f esto significa que vamos que vamos a especificar el vertice con 3 valores de tipo real, en b) tenemos que termia en fv estamos indicando a OpenGL que el verice lo daremos mediante un vector de floats.

Page 26: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

glclearcolor() recibe como parámetro un vector de 4 valores que determinan el color con el que se inicializa nuestro frame buffer, antes de escribir en el, dando como resultado un color de fondo.

glColor3f(r,g,b) define el color del punto r(cantidad rojo), g(cantidad de verde) y b(cantidad de azul) utilizando el sistema RGB.

ejem: glColor3f(0.0,0.0,0.0) color negroglColor3f(1.0,1.0,1.0) color blanco

GLClear() sirve para borrar desde frame buffer valores de escena que hayan sido construidas previamente a la actual.

GLPointSize(2.0) determina el numero de pixeles reales que ocupara cada uno de nuestros puntos (cada punto deberá tener un grosor de 2 pixeles).

GLBegin() y GLEnd sirven para determinar los vértices de una figura.

Ejem: glColor3f(1.0,1.0,1.0);glBegin(Gl_TRIANGLES);

glVertex3f(-1.0,0.0,0.0);glVertex3f(1.0,0.0,0.0);glVertex3f(0.0,1.0,0.0);

glEnd();

Page 27: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Respecto a las constantes que podemos usar en la función glBegin tenemos entre otras

• GL_POINTS: puntos

• GL_LINES: cada 2 vértices definidos, se traza automáticamente una línea que los une.

• GL_POLYGON: se unen todos los vértices formado un polígono.

• GL_QUADS: cada 4 vértices se unen para formar un cuadrilátero.

• GL_TRIANGLES: cada 3vertices se unen para formar un triangulo.

• GL_TRIANGLE_STRIP: crea un triangulo con los 3 primero vértices. entonces sucesivamente crea un nuevo triangulo unido al anterior usando los dos últimos vertices vertices que se han definido y el actual.

• GL_QUAD_STRIP: igual que el anterior pero con cuadriláteros.

Page 28: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 29: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Header Files

#include <windows.h>#include <GL/gl.h>#include <GL/glu.h>

#include <GL/glut.h>

Page 30: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Display-Windows Using GLUTglutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowPosition(50,100);

Page 31: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 32: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 33: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 34: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 35: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

y

Page 36: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

glutInitWindowSize(400,300);glutCreateWindow(“An Example OpenGl Program”);glutDisplayFunc(lineSegment);glutMainLoop();

glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);

glMatrixMode (GL_PROJECTION);gluOrtho2D(0.0,200.0,0.0,150.0);

glBegin(GL_LINES);glVertex2i(180,15);glVertex2i(10,145);

glEnd();

Page 37: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

A Complete OpenGL Program

Acceso directo a Pba

Page 38: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Compilación de ejemplos de OpenGl y Visual C++ 6.0 bajo Windows 98/Me/XP

Archivos necesarios para compilar

Glu32.dllGlut32.dllOpengl32.dll

C:\windows\system

Glaux.libGlu32.libOpengl32.libGlut32.lib

C:\Archivos de programa\Microsoft Visual Studio\VC98\lib

Gl.hGlaux.hGlu.hGlut.h

C:\Archivos de programa\Microsoft Visual Studio\VC98\includes\gl

Page 39: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

1. File/New/proyects/Win32n Console Application o Win32 Applicationa) si utiliza GLUT entonces seleccione Win32n Console Applicationb) Si Apis de win32 seleccione Win32 Applicationc) Project name (escribir nombre del proyecto)d) Location (Directorio donde esta el código fte. del proyecto

2. File/New/Files/C++ Source File/File name (main) /OKaquí pegamos el código fuente

3. Antes de compilar, agregar las librerías correspondientes en Project/Settings/Links/cuadro Objects/library modules: aquí escribirglut32.lib, glu32.lib, glaux.lib bueno todas la librerías a usar

/Output file name (C:\CURSO-GRAFICACION\programas-ejemplos\Debug)

4. Compilar

5. Si todo esta bien, entonces es generada una carpeta debug y es aquí donde se encuentra el ejecutable (main.exe) de la aplicación

CREACIÓN DE UN NUEVO PROYECTO VC++ 6.0

Page 40: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Ejemplo 1#include <gl/glut.h>

void display(void) {glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glutWireTeapot(0.5);glFlush();glutSwapBuffers();

}

void main(void) {glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB);glutInitWindowSize(400, 400);glutInitWindowPosition(100, 100);glutCreateWindow(“Ejemplo cutre de GLUT”)

glClearColor(0.0, 0.0, 0.0, 1.0);glEnable(GL_DEPTH_TEST); glutDisplayFunc(display);glutMainLoop();

}

Page 41: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Compilación con Visual“File | New”. Seleccionamos “Win32 Console Application” en la pestaña “Projects”. Introducimos el nombre y path del proyecto. Pulsamos OK.

Page 42: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Compilación con VisualSeleccionamos la opción “An empty project” y pulsamos Finish y luego OK. Esto crea un proyecto vacío.

Page 43: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Compilación con Visual“Project | Add to project… | New…”. Seleccionamos en “Files” la opción “C++ Source File”. Le damos un nombre y pulsamos sobre OK.

Page 44: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Compilación VC++ 6.0“Project | Settings” . En “Link” seleccionamos “All Configurations”Añadimos al cuadro de edición “Object / library modules” las siguientes librerías: opengl32.lib glu32.lib glut32.lib y pulsamos OK.

Page 45: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

CompilaciónVC++ 6.0Escribimos el código del program, pulsamos sobre el icono

Y a la pregunta respondemos “Sí”.

Acceso directo a ejemplo1Acceso directo a teteramAcceso directo a Brazo

Page 46: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Usando glut en Linux 1. Descargar (root) Mesa-glut-X.X-X.i386.rpm

2. Desempaquetar rpm –ivh Mesa-glut-X.X-X.i386.rpm

3. Instalar (entrar al directorio donde se desempaquetaron)ejecutar

* make (make linux)* make install

(cp –r include/GL a /usr/include/GLcp –r lib/* a /usr/lib)

4. gcc –o file file.c –lglut –lglu –lGL (Makefile)

Nota: si descarga el paquete desde mi pagina entonces utilice (glut-3.7)

# ./mkmkfiles.imake# make# make install

Page 47: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

1) Compilar usando un archivo Makefile

a) Editar Makefile, suponemos que la aplicación es lines.c

# vi Makefile

INCLUDE = -I/usr/X11R6/include/LIBDIR = -L/usr/X11R6/lib/CFLAGS = -WallCC = gccLIBRARIES = -lX11 -lXi -lXmu -lglut -lGL -lGLU -lmOBJECTS = lines.oall: lines

lines: $(OBJECTS)$(CC) $(CFLAGS) $(INCLUDE) $(LIBDIR) -o $@ $(OBJECTS) $(LIBRARIES)

lines.o: lines.c$(CC) $(CFLAGS) -c lines.c

.PHONY: cleanclean:

rm lines $(OBJECTS)

Page 48: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

b) Compilar el archivo lines.c# make

c) Ejecutar# ./lines

Page 49: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

DESCRIPCIÓN DEL CUERPO DE UN PROGRAMA La librería GLUT son:

inicializa GLUTsetea nuestra ventana de trabajo donde x y y son las coordenadas de nuestra ventanadefinimos tamaño de nuestra ventanadefinimos el “modo”

modo puede tomar los siguientes valores:* GLUT_RGB o GLUT_RGBA selecciona una

ventana con RGB(rojo, verde, azul o RGBA(rojo, verde, azul y el canal alfa)

* GLUT_INDEX ?* También se puede especificar que buffer:

- GLUT_ACCUM buffer de acumulación - GLUT_STENCIL buffer stencil, se ocupa

para reflejos y sombras- GLUT_DEPTH buffer de fondo

se crea la ventanafunc es el nombre de la función que hace las tareas de dibujarahora le avisamos a GLUT que estamos listos para entrar en loop de eventos de la aplicación

glutInit(int arg, char **arrgv);glutWindowPosition(int x, int y);

glutWindowSize(int width, int height);glutDisplayMode(unsigned int mode);

glutCreateWindow(char *title);glutDisplayFunc(void *(func)(void));

glutMainLoop();

Si se quiere una ventana tipo RGB, con buffer simple seria:glutDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH);

Page 50: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

OpenGL en Dev C++1. La librerías GLUT para Dev C++ descomprimir(*.zip) → Directorio X

2. glut32.dll (X) →windows/system (Windows 9x/Me),→windows/system32(WindowsNT/2000/XP/2003).

3. Glut.h (X)→ subdirectorio Include/Gl de Dev C++

4. glut32.def (X) e libglut.a (X) → C:\Dev C++\Lib

Page 51: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Creación de los programasPara que la compilación sea exitosa debemos indicar que librerías utilizaremos en nuestros programas. La forma de hacer esto en Dev-C es la siguiente:

1. Crear un proyecto. Eso lo consigues haciendo click en el botón Project... de la barra de herramientas, o bien, en el menu File -> New -> Project..., elije Emptyproject y dale nombre a tu proyecto

Page 52: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

2. Ir al menu Project -> Project Options o selecciona el botón correspondiente de la barra de herramientas. En el cuadro de diálogo que aparece ve a la pestaña Parameters. En el cuadro que dice Linker agrega los siguientes archivos (se encuentran en el directorio lib de Dev-C):

libglu32.a libopengl32.a libglut32.a

Alternativa 1-lopengl32-lglut32-glu32

Page 53: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Alternativa 2

-lopengl32-lglut32-glu32

Page 54: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

3. Solo falta agregar archivos fuente a tu proyecto, o bien, crearlos desde ahí. No olvides abrir el proyecto y no solo el código fuente cuando desees compilar tus programas.

Page 55: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Primitivas de objetos predefinidos

Hay algunos objetos que vamos a renderizar muy a menudo, y que por tanto, ya vienen definidos. Así, disponemos de las siguientes funciones:

• glutWireSphere(radius, slices, stacks)• glutSolidSphere(radius, slices, stacks)• glutWireCube(size), glutSolidCube(size)• glutWireCone(base, height, slices, stacks),• glutSolidCone(base, height, slices, stacks)• glutWireDodecahedron(void),• glutSolidDodecahedron(void)• glutWireOctahedron(void), glutSolidOctahedron(void)• glutWireTetrahedron(void), glutSolidTetrahedron(void)• glutWireIcosahedron(void), glutSolidIcosahedron(void)• glutWireTeapot(void), glutSolidTeapot(void)

Page 56: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 57: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Algoritmo de Línea Bresenham Básico

El algoritmo busca cual de dos píxeles es el que esta mas cerca según la trayectoria de la línea. Consideremos el proceso de conversión para líneas con pendiente positiva 0 < m < 1.Las posiciones de píxel a lo largo de la trayectoria de una línea se determinan al efectuar un muestreo de x en intervalos unitarios.

Si se inicia desde el extremo izquierdo (x0,y0) de una línea determinada, se pasa a cada columna sucesiva y se traza el píxel cuyo valor de y se aproxima mas a la trayectoria de la línea de rastreo.Si suponemos que se debe desplegar el píxel en (xk,yk), a continuación se necesita decidir que píxel se debe desplegar en la columna xk+1. Las alternativas son los píxeles (xk+1,yk), y (xk+1,yk+1).Al realizar el muestreo en la posición xk+1 designamos la separación de píxeles verticales de la trayectoria de la línea matemática como d1 y d2.

Page 58: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

La coordenada de y en la línea matemática en la posición de la columna de píxel xk+1 se calcula comoLa coordenada de y en la línea matemática en la posición de la columna de pixel xk+1 se calcula como

(10) y = m (xk + 1) + bEntonces

d1 = y - yk = m (xk + 1) + b – yk yd2 = (y k + 1) - y = y k + 1 - m (x k + 1) – b

(11) d1 - d2 = 2m (x k + 1) - 2 yk + 2 b – 1

Un parámetro de decisión pk para el paso k en el algoritmo de línea se puede obtener al reordenar la ecuación anterior, de modo que implique solo cálculos de enteros.Esto se logra sustituyendo m = ∆ y / ∆ x donde ∆ x y ∆ y son las separaciones horizontal y vertical de las posicionesde los extremos de la línea y al definir:(12) pk = ∆x (d1 - d2) = ∆ x (2 ∆ y / ∆ x (x k + 1) - 2 yk + 2 b - 1)

= 2 ∆ y xk - 2 ∆ x yk + 2 ∆ y + 2 b ∆ x - ∆ x= 2 ∆ y xk - 2 ∆ x yk + c

Page 59: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

El signo de pk es el mismo que el de d1 - d2 puesto que ∆ x > 0 en el ejemplo.El parámetro c es un constante, donde c = 2∆ y + 2 b ∆ x - ∆ x, que es independiente del pixel.

Si el pixel yk esta mas cerca de la trayectoria de la línea que el pixel y k + 1 (es decir d1 < d2), entonces el parámetro de decisión pk es negativo.

En ese caso, trazamos el pixel inferior; de otro modo, trazamos el pixel superior.Los cambios de coordenadas a lo largo de la línea ocurren en pasos unitarios ya sea en la dirección de x o en la de y. Por tanto, es posible obtener los valores de parámetros de decisión sucesivos al utilizar cálculos incrementales en enteros.

En el paso k + 1, el parámetro de decisión se evalúa con base en la ecuación anterior como

pk+1 = 2 ∆y xk+1 - 2 ∆ x yk+1 + c

Al sustraer la ecuación (12) de la anterior obtenemospk+1 - pk = 2 ∆ y (xk+1 - xk) - 2 ∆ x( yk+1 - yk)Pero xk+1 = x k + 1, de manera que

(13) pk+1 = pk + 2 ∆ y - 2 ∆ x( yk+1 - yk)

donde el termino yk+1 - yk es 0 o 1, dependiendo del signo del parámetro p.

Page 60: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Este calculo recurso de los parámetros de decisión se realiza en cada posición entera de x, empezando en el extremo izquierdo de las coordenadas de la línea.El primer parámetro p0 se evalúa a partir de la ecuación (12) en la posición del pixel inicial (x0,y0), sustituyendo con

b = y0 - m x0 y m = ∆ y / ∆ x.p0 = ∆ x (2 ∆ y / ∆ x(x0 + 1) - 2 y0 + 2 (y0 - (∆y / ∆x) x0) - 1)

= 2 ∆ y x0 + 2 ∆ y - 2 ∆ x y0 + 2 ∆ x y0 - 2 ∆ y x0 - ∆x

donde se obtiene la siguiente ecuación:

(14) p0 = 2 ∆y - ∆ x

Page 61: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

En resumen, los pasos son:1. Se capturan los dos extremos de la línea y se almacena el extremo izquierdo en (x0,y0).2. Se carga (x0,y0) en el bufer de estructura, o sea, se traza el primer punto.3. Se calculan las constantes y, ∆x, 2 ∆ y, 2y-2 ∆ x, y se obtiene el valor inicial para el

parámetro de decisión como p0 = 2 ∆ y - ∆ x.4. En cada xk a lo largo de la línea, que inicia en k = 0, se efectúa la prueba siguiente: si pk

< 0, el siguiente punto que se debe trazar es (xk+1,yk) y p k +1 = pk + 2 ∆ y. De otro modo, el siguiente punto en trazarse es (xk+1,yk+1) y p k +1 = p k + 2 ∆ y -2 ∆ x.

5. Se repite el paso 4 otras ∆ x veces.

EjemploPara ilustrar el algoritmo, utilicemos la línea con extremos (20,10) y (30,18).Esta línea tiene una pendiente de 0.8, con ∆ x = 10, ∆ y = 8El parámetro de decisión inicial tiene el valor p0 = 2 ∆ y - ∆ x = 6y los incrementos para calcular parámetros de decisión sucesivos son:

2 ∆ y = 16 2 ∆ y - 2 ∆ x = -4

Trazamos el punto inicial (x0,y0) = (20,10) y determinamos las posiciones de píxel sucesivos a lo largo de la trayectoria de la línea a partir del parámetro de decisión como

Page 62: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

\programas-ejemplos\lin-bez.exe

Page 63: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Algoritmos de Generación de CircunferenciasUna circunferencia se define como un conjunto de puntos que se encuentran, en su totalidad, a una distancia r de una posición central (xc, yc).Esta relación de distancia se expresa por medio del teorema de Pitágoras en coordenadas cartesianas como

(24) (x - xc)2 + (y - yc) 2 = r2

Algoritmo Básico

Se podría utilizar una ecuación para calcular la posición de los puntos de una circunferencia pasando a lo largo del eje de las x en pasos unitarios de xc - r a xc + r y calcular los valores correspondientes de y en cada posición como

Page 64: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Un método para dibujar el circulo es aprovechar la simetría de los cuadrantes, dibujando solo uno y trazando los puntos simétricos en los demás cuadrantes.Para el primer cuadrante se incrementaría x de 0 a r en pasos de 1, resolviendo para cada y positiva.El trazo para un circulo con radio de 10, centrado en (0,0), utilizando este algoritmo básico, se muestra a continuación:

Page 65: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

El resultado de esto se muestra en la siguiente figura:

El problemas con método directo•Cálculos considerables en cada paso•El espacio entre píxeles no es uniforme•Se podría ajustar al espacio al intercambia x y y siempre que |m|>1

Si aprovechamos la simetría de la circunferencia , se puede generar todas las posiciones del pixel alrededor de una circunferencia, calculando los puntos x=0 y x=y

Page 66: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

12

3

4

5 6

7

8

Simetría en la circunferencia

Para un r determinado y una posición central (xc,yc), se debe establecer el primero el algoritmo para calcular la posición del pixel alrededor de una trayectoria circular centrada en el origen de coordenadas (0,0). Asi cada posición calculada (x,y)se mueve a su posición propia en la pantalla al sumar xc a x y yc a y

Page 67: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

A lo largo de la sección circular de en el primer cuadrante, la pendiente (m) de la curva varia entre 0 y -1.

Para aplicar el método del punto medio, se define una función de circunferencia como:

Cualquier punto (x,y) en la frontera de la circunferencia con radio r satisface la ecuación fcirc(x,y) = 0. Si el punto esta en el interior de la circunferencia, la función de la circunferencia es negativa.

Para resumir, la posición relativa se puede determinar al verificar el signo de la función de circunferencia:

Page 68: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

La siguiente figura muestra el punto medio entre los dos pixeles candidatos en la posición de muestreo xk + 1.

Suponiendo que se acaba de trazar el pixel en (xk, yk), en seguida se necesita determinar si el pixel en la posición (xk + 1, yk), o aquel en la posición (xk + 1, yk - 1) esta mas cerca de la circunferencia. El parámetro de decisión es la función de circunferencia (27) evaluada en el punto medio entre esos dos píxeles.

Page 69: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Se obtiene al evaluar la función de circunferencia en la posición de inicio (x0, y0) = (0,r)

p0 = fcirc(1, r - 1/2) = 1 + (r - 1/2) 2 - r2

o(31) p0 = 1 + r 2 - r + ¼ - r2 = 5/4 – r

Si el radio r se especifica como un entero, se puede redondear simplemente p0 ap0 = 1 - r (para r como un entero).

Page 70: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Se puede resumir los pasos del algoritmo de la circunferencia de punto medio como sigue:

1. Se capturan el radio r y el centro de la circunferencia (xc,yc) y se obtiene el primer punto de una circunferencia centrada en el origen como (x0,y0) = (0,r).

2. Se calcula el valor inicial del parámetro de decisión como p0 = 5/4 - r.

3. En cada posición xk, iniciando en k=0, se efectúa la prueba siguiente:Si pk < 0, el siguiente punto a lo largo de la circunferencia centrada en (0,0) es(xk+1,yk) y pk+1 = pk + 2xk+1+1 = pk + 2xk +3. De otro modo, el siguiente punto a lo largo de la circunferencia es

(xk+1,yk -1) y pk+1 = pk + 2xk+1+1 - 2yk+1 = pk + 2xk - 2yk +5,

donde 2xk+1 = 2xk + 2 y 2yk+1 = 2yk + 2.

4. Se determinan puntos de simetría en los siete octantes.

5. Se mueve cada posición de pixel calculada (x,y) a la trayectoria circular centrada en (xc,yc) y se traza los valores de las coordenadas x = x + xc, y = y + yc.

6. Se repiten los pasos 3 a 5 hasta que x≥y.

Page 71: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

EjemploDado el radio de una circunferencia r=10, se demuestra el algoritmo de la circunferencia de punto medio al determinar las posiciones a lo largo del octante de la circunferencia en el primer cuadrante desde x=0 hasta x=y. El valor inicial del parámetro de decisión es p0 = 1 - r = -9En el caso de la circunferencia centrada en el origen de las coordenadas, el punto inicial es(x0,y0) = (0,10) y los términos de incremento iniciales para calcular los parámetros de decisión son 2 x0 = 0, 2 y0 = 20 Los valores sucesivos del parámetro de decisión y las posiciones a lo largo de la trayectoria de la circunferencia se calculan mediante el método del punto medio como

Page 72: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

En la siguiente figura se muestran las posiciones generadas en el primer cuadrante:

Page 73: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

1.3 Interpolación cúbicos

Un interpolante cúbico tiene la profundidad de que las funciones de las tres dimensiones x(t), y(t) y z(t), son polinomios cúbicos en la variable t:

Como lo que aquí interesa son los segmentos de curva, el dominio de t es finito y se supondrá que 0≤t≤1.Una interpolación pasa a través de dos puntos y cumple con una condición de diferenciabilidad en cada extremos. Estas cuatro condiciones requieren, al menos, un grado polinomial de 3.

figura 1a

Page 74: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Esta razón del uso tan generalizado de los interpelantes. Si se dan N+1 puntos, se debe de funcionar Ninterpolantes. Las derivadas iguales en los extremos de cada interpolante proporciona la continuidad en las uniones (figura 1a).

El proceso para obtener los polinomios cúbicos es similar para x,y, y z. La única diferencia esta entre los valores asignados para los extremos y sus derivadas. Por esta razón solo se describe la ecuación x(t). Dados N+1 puntos

se desea obtener el interpolante cúbico que une dos puntos consecutivos. Para cada par de puntos xi, xi+1 se tiene las suposiciones siguientes

1. La curva interpolante pasa por los puntos extremos:

2. El interpolante cumple con una condición de diferenciabilidad en estos puntos, Así, son conocidos x’(0) y x’(1) donde la prima representa la diferenciación con respecto a t .Dado que :

Page 75: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Es un sistema de cuatro ecuaciones y cuatro incógnitas: a, b, c y d. Al obtener la solución única, se tiene

En términos de matrices:

Al sustituir los valores de t=0 y t=1 en las ecuaciones, se obtiene

Page 76: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Los coeficientes de los polinomios interpolantes cúbicos y(t) y z(t) se obtiene de manera similar, reaplazando los valores del dato x y sus derivadas por los correspondientes valores y derivadas de y y z.

Para dibujar un interpolante cúbico entre dos puntos consecutivos, se calculan varios valores de x(t), y(t) y z(t). Los valores calculados se unen por medio de segmentos de rectas.

Page 77: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

1.3 CURVAS DE BEZIER

Polinomio cúbico de Bezier.

Acceso directo a bezier34

figura 2a

Page 78: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 79: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 80: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 81: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 82: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

La curva de Bezier (cúbica) se determina completamente con cuatro puntos consecutivos:

La línea sigue el segmento de línea poligonal a través de los cuatro puntos de control, pero solo pasa por el primero y cuarto punto (Figura) los dos puntos intermedios se usan para definir la pendiente de la curva de los extremos. Solo veremos la ecuación las ecuaciones para la variable x (las de y y z son similares). Sea

las suposiciones son:1.La curva pasa por los extremos:

2.pendiente en los extremos esta determinada por el extremo y el punto adyacente. El coeficiente 3 resulta del hecho de que la derivada de x3 es 3x2:

Al sustituir estos valores en el lado izquierdo de la ecuación 12-1 y simplificando, se obtiene

Page 83: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 84: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 85: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 86: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

B03(t)= 3! (1-t)3-0t0= (1-t)3

(3-0)!0!

B13(t)=3t(1-t)2=3t3+3t-6t2

B23(t)=3t2(1-t)=3t2-3t3

B33(t)=t3

Page 87: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

P(t)=P3t3 + P2(3t2-3t3)+ … =(P3-3P2+3P1-Po)t3 + (….) t2 + (…) t + P0

= at3 + b t2 + c t + d

P(t)= at3 + bt2 + ct + dX’(0)=n(X1-X0) X‘(1)=n(Xn-Xn-1)

1) X(0)=d2) X(1)= a + b + c + d

3) 3(X1 - Xo) = X’(0)= c4) 3(X3 - X2)= X’(1)= 3a+2b+c

en 2) X(1)=a+b+3(X1- X0) + X0=a+b+3X1 -2X0

2a) b=-a-3X1+ 2X0 +X(1)=2Xo-3X1- a +X(1)

en 4) 3(X3-X2)=3a+2[2Xo-a-3X1+X(1)]+3(X1-X0)=3a+4X0-2a-6X1+2X(1)+3X1-3X0=a+X0-3X1+2X(1)+3X1-3X0=a+X0-3X1+2X(1)

a=-X0+3X1-3X2+3X3-2X(1)4a) a=-X0+3X1-3X2+3X3-2X(1)

1ª.

2ª.

Page 88: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

en 2a) b =2X0+X0-3X1+3X2-3X3+2X(1)-3X1+X(1)= 3X0-6X1-3X2-3X3+3X(1)

cte.

abcd

=

X0X1X2X3

Page 89: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 90: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 91: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 92: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Tipos de superficie más frecuentes utilizadas:

A) Superficies de revolución. Se genera por rotación de una curva cualquiera (generatriz) alrededor de un eje.

Page 93: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

B) Superficies cilíndrica. Se generan por una curva abierta o cerrada (base o generatriz) al desplazarse y siguiendo una trayectoria recta o curva abierta (eje). El plano que contiene a la generatriz formará en toda su trayectoria un ángulo constante con el eje o directriz. Estas superficies pueden clasificarse en:

• Barrido: la directriz es un segmento rectilíneo En este caso el desplazamiento es una traslación simple.

• Deslizamiento: La directriz es una polilínea 2D o 3D compuesto por tramos de rectas y curvos. El desplazamiento de la generatriz consta de desplazamientos y giros

Page 94: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 95: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

C) Superficies regladas. Generadas por una línea rectas (generatriz) al desplazarse apoyadas en dos curvas ( directrices) iguales o diferentes

Superficie regladas

Page 96: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

Superficies esculpidas

D) Superficies Esculpidas (deslizamiento 3D). Generadas por una curva al desplazarse apoyadas en dos curvas no concéntricas

Page 97: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

E) Superficies Adaptadoras. Generadas por una línea recta apoyadas en dos curvas extremas diferentes, generalmente una poligonal rectilínea y la otra compuesta de arcos

Page 98: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

F) Formas libres. Se puede obtener por dos procedimientos diferentes: interpolación o aproximación.La interpolación puede ser: Lineal, Bilineal, De Lagrange y Cubica

Page 99: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 100: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía
Page 101: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

f.1) Superficies racionales Splines, B-splines, Bezier y Nurbs. La diferencia fundamental estriba en que están controladas no por un poligono, sino por un poliedro consistente en una malla de puntos en el espacio 3D debidamente ordenados

Page 102: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía

f.2) Superficies de Bezier. Estas superficies se determinan por un poliedro de u*v vértices y se generan a través del proceso siguiente.

Page 103: GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía