Issuu on Google+

COMPUTACION GRAFICA II (7050160100642)->M (7050150100642)->E

Prof.: Arq.Ivรกn Burgos, Mg.Sc. (Ing.Luz-1989) Julio, 1999

Comp.Grafica II, I.Burgos-Julio/1999


COMPUTACION GRAFICA II BIBLIOGRAFIA : Principles of Interactive Computer Graphics. W.Neumann & R.Sproull. Ed.McGraw-Hill, Inc. 1979. Interactive Microcomputer Graphics. Chan S. Park. Ed.Addison Wesley, Inc. 1985. Graficacion Por Computador con Pascal. Marc Berger. Ed.Addison-Wesley Iberoamericana, 1991. Computer Graphics. D.Hearn & P.Baker. Ed.Prentice Hall, 1986. Programming with C++. John Hubbard. Ed.MacGraw Hill, Shaum’s Outline Series , 1996. C++. Ivor Horton. Wrox Press Ltd.,1998. Your First C/ C++ Program. Alan Neibauer. Ed.Sybex, Inc. , 1994. C++. Ivor Horton. Wrox Press Ltd.,1998. OpenGL Programming Guide. M.Woo, J.Neider & T.Davis. Ed.Addison-Wesley Developer Press, 1997. OpenGL Programming for Windows 95 & Windows NT. Ron Fosner. Ed.Addison-Wesley Developer Press, 1998 Algorithms, Data Structures and problem solving with C++. Mark Allen Weiss. Ed.AddisonWesley Publisher, 1995.

Comp.Grafica II, I.Burgos-Julio/1999


Representación Gráfica Tridimensional Representación matricial del Punto P1:

z1

x1 P1

y1

x1   y1  z1 

NOTA: Observese el sentido positivo del eje Z, es Mano Derecha. Comp.Grafica II, I.Burgos-Julio/1999


Representación Gráfica Tridimensional Sentido Mano Derecha (usado por el OpenGL)

Sentido Mano Izquierda (Según Monitor)

Comp.Grafica II, I.Burgos-Julio/1999


Representaci贸n Gr谩fica Tridimensional

Objetos Transparentes (Wire Frame)

Objetos Solidos

Comp.Grafica II, I.Burgos-Julio/1999


Técnicas Tridimensionales de Representación Proyecciones Paralelas:

P2

Centro de Proyeccion en ∞

P2´

P1

P1’ Plano de Proyeccion

Comp.Grafica II, I.Burgos-Julio/1999


Técnicas Tridimensionales de Representación Proyecciones Perspectivas:

P2 P2´

P1

P1’ Plano de Proyeccion

Comp.Grafica II, I.Burgos-Julio/1999

Centro de Proyeccion


Criterios de Representaci贸n Tridimensional Siempre Objetos Convexos. Los cuales son representados a su vez por conjuntos de planos o poligonos. Lo usual es almacenar la informacion en tres arreglos: Vertices, Bordes o Lineas y Poligonos o Superficies. v1 v2 v3 v4 v5

x1 x2 x3 x4 x5

y1 y2 y3 y4 y5

z1 z2 z3 z4 z5

v2 e6

e1 s1 v1

e3

Comp.Grafica II, I.Burgos-Julio/1999

v3

e2

v5

s2 e4

e5 v4

s1 s2

E1 E2 E3 E4 E5 E6

v1 v2 v3 v3 v4 v5

v2 v3 v1 v4 v5 v2

e1 e2

e2 e4

e3 e5

e6


Criterios de Representaci贸n Tridimensional ECUACIONES VARIAS.La orientacion de un plano se determina por el Vector Normal (DN) a ese plano. Asi, si el punto esta en el plano, satisface la igualdad: Ax+By+Cz+D=0; de donde cualquier punto fuera del plano cumple la siguiente desigualdad Ax+By+Cz+D<>0; Cualquier punto del lado dentro del plano produce un valor negativo para Ax+By+Cz+D; y en caso contrario produce valor positivo.

z

Comp.Grafica I, I.Burgos-Julio/1999

y

DxN,DyN,DzN xP,yP,zP

x


Criterios de Representación Tridimensional ECUACIONES VARIAS.Productos Vectoriales. v1 Sean v1=(x1,y1,z1) y v2=(x2,y2,z2), el producto punto viene dado por: v1.v2=x1x2+y1y2+z1z2, el producto punto no es vector sino un numero real (escalar), por lo que en forma vectorial : v1.v2=|v1| |v2| x cos θ, de donde si v1 y v2 forman un angulo recto entonces el producto punto =0

θ

v2

v2 El Producto Cruzado de los vectores v1 y v2 es otro vector: v1 x v2 = (y1z2-z1y2,z1x2-x1z2,x1y2-y1x2) el producto cruzado de dos vectores no paralelos es un vector perpendicular a ambos

Comp.Grafica II, I.Burgos-Julio/1999


Matrices y Transformaciones Para la representacion matricial tridimensional, se utiliza el mismo criterio de la bidimensional: [ x y z ] => [x y z 1] de donde la matriz general de 4 x 4 de transformaciones tridimensionales es: a b c p  3 x3 3x1 def g Transf.Lineales Proy.Perspectivas hi j n 1x3 1x1 l m n s  Traslacion Escalam.General Esto nos brinda la posibilidad de multiples combinaciones

Comp.Grafica II, I.Burgos-Julio/1999


Matrices y Transformaciones Traslacion: matriz de transformacion de traslacion: 1000 0100 0010 lmn1

Rotacion: en X: 1 0 0 cos() 0 -sen() 0 0

0 sen() cos() 0

Comp.Grafica II, I.Burgos-Julio/1999

0 0

0 1

en Y: cos(φ) 0 sen(φ) 0

0 1 0 0

-sen(φ) 0 0 0 cos(φ) 0 0 1

x’=x+l y’=y+m z’=z+n

en Z: cos(ψ) sen(ψ) -sen(ψ) cos(ψ) 0 0 0 0

0 0 1 0

0 0 0 1


Matrices y Transformaciones Escalamiento Local: x’=x*Sx y’=y*Sy z´=z*Sz

si Sx=Sy=Sz>1 aumenta si Sx=Sy=Sz<1 disminuye

matriz escalamiento local: Sx 0 0 0 0 Sy 0 0 0 0 Sz 0 0 0 0 1

Escalamiento General: matriz escalamiento General: 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 S

Comp.Grafica II, I.Burgos-Julio/1999

Al establecer esta operación se debe normalizar la matriz resultante: x/s, y/s, z/s, s/s


Matrices y Transformaciones Reflexiones: Matriz Reflexion en XY:

1 0 0 0

en YZ:

-1 0 0 0

0 1 0 0

0 0 1 0

0 0 0 1

en XZ:

1 0 0 0

0 -1 0 0

0 0 1 0

0 0 0 1

Comp.Grafica II, I.Burgos-Julio/1999

0 1 0 0

0 0 0 0 -1 0 0 1


Matrices y Transformaciones Rotacion en Pivote Arbitrario: Concatenacion de matrices (recordar el PushMatrix y PopMatrix del OpenGL), Se sigue el mismo procedimiento de 2Dim. Rota (Ď&#x2C6;)= Mtrasl*RotaX*RotaY*RotaZ*RotaY-1*RotaX-1*Mtrasl-1

Escalamiento en Pivote Arbitrario:Se sigue el mismo procedimiento de 2Dim Matriz Concatenada:

sX 0 0 0 sY 0 0 0 sZ (1-sX)*l (1-sY)*m (1-sZ)*n

Comp.Grafica II, I.Burgos-Julio/1999

0 0 0 1


Ocultamiento de Superficies Existen varios algoritmos que tratan el problema del ocultamiento de superficies, el tratado en este punto es el mas basico y elemental. Los objetos estudiados deben ser de tipo convexo. Para tratar un objeto concavo debe subdividirse en varios menores de tipo convexo. El criterio primario para ocultar superficies es determinar la normal al plano en estudiocon respecto al vector constituido por el observadorLa operaci贸n esta dada por el producto cruzado de los dos vectores que determinan un tercero. Con los lados o bordes del plano se conocen dos vectores del plano y con la operaci贸n entre ellos se determina el normal el cual a su vez se compara con el vector observador y dependiendo de su angulo (- 0 +) se establece que superficie o cara se ve y cual no. Comp.Grafica II, I.Burgos-Julio/1999


Ocultamiento de Superficies R (Vector Normal al plano) Con los bordes se determinan los dos vectores en el plano (p y q) R=¦p¦ ¦q¦ *sen(θ)=pxq [Rx,Ry,Rz]=[px,py,pz]x[qx,qy,qz] Rx=pyqz-pzqy Ry=pzqx-pxqz Rz=pxqy-pyqx

q

p

OBSERVADOR (Obx,Oby,Obz)

NORMAL AL PLANO (R)

a=R.OBSERVADOR; a=RxObx+RyOby+RzObz el vector OBSERVADOR se determina por las coordenadas del OBSERVADOR y un punto cualquiera del plano. Ejemplo:un vertice Comp.Grafica II, I.Burgos-Julio/1999

a

El proximo paso es comparar el angulo formado por el vector observador y la normal al plano, si el valor es negativo la cara no se ve, caso contrario se ve


Recorte (Clipping) Tridimensional Basicamente repite el esquema 2D pero con la sensacion de profundidad, es por ello importante el valor de la coordenada Z. Para Proyecciones Axonometricas el asunto es sencillo pues es la coordenada Z, la que marca la pauta. Lineas proyeccion

Y

Y

objeto zob1 X

anterior zob2 Z

zob1 X

ZV (plano clip)

Zob1>ZV

Comp.Grafica II, I.Burgos-Julio/1999

objeto posterior zob2 Z ZV (plano clip)

Zob1<ZV


Recorte (Clipping) Tridimensional Para Perspectivas se proyectan los rayos del C.P. Pasando a traves de una ventana que forma la piramide de base cuadrada (o rectangular), generando asi un volumen de clipping, dentro del cual los objetos se ven total o parcialmente o no se ven

Frente

Fondo

C.P.

ventana

Comp.Grafica II, I.Burgos-Julio/1999

Volumen de clipping


Recorte (Clipping) Tridimensional Proyecciones Paralelas: PCT(tope)

y PCB(base)

yvmax

Direccion del vector : ylp/zlp yvmin

x Cualquier punto (x,y,z)en esa linea inclinada cumple que: y/z=ylp/zlp, la ecuacion de la recta del punto con la inclinacion sera: yt=ylp/zlp (z)+yvmax; que es la ecuacion del plano Comp.Grafica II, I.Burgos-Julio/1999

z


Recorte (Clipping) Tridimensional Proyecciones Paralelas: PCT(tope)

y PCB(base)

yvmax

Direccion del vector : ylp/zlp yvmin

x yb=ylp/zlp (z)+yvmin; xd=xlp/zlp (z)+xvmax; xi=xp/zlp (z)+xvmin; Comp.Grafica II, I.Burgos-Julio/1999

z


Recorte (Clipping) Tridimensional Proyecciones Paralelas: ym=ylp/zlp ; xm=xlp/zlp ; entonces : yt=ym(z)+yvmax ; yb=ym(z)+yvmin; xd=xm(z)+xvmax; xi=xm(z)+xvmin.

Comp.Grafica II, I.Burgos-Julio/1999


Recorte (Clipping) Tridimensional Proyecciones Perspectivas: y

PCT

PCI

z

PCD PCP (ZP)

yvmax

C.P.

PCF

yvmin

(yc,zc)

x

PCF (ZF)

(ZF)

PCP (ZP)

z PCB

y

xvmin

xvmax

x

C.P.

(xc,zc)

Cualquier punto (p) para, por ejemplo, la linea (plano)PCT cumple (y,z)=(yvmax,0), unido con C.P.(centro proyeccion) (y,z)=(yc,zc), igualando ambas ecuaciones en la ecuacion de la recta se tiene: yt=(yc-yvmax/zc)*z+yvmax ; asi para la base se tiene: yb=(yc-yvmin/zc)*z+yvmin ; para el lado derecho: xd=(xc-xvmax/zc)*z+xvmax ; para el lado izquierdo: xi=(xc-xvmin/zc)*z+xvmin simplificando la pendiente del plano respectivo: ytM=(yc-yvmax/zc) ; ybM=(yc-yvmin/zc) ; xdM=(xc-xvmax/zc) ; xiM =(xc-xvmin/zc) ; que a su vez son las pendientes de los planos PCT,PCB,PCD,PCI respectivamente.

Comp.Grafica II, I.Burgos-Julio/1999


Recorte (Clipping) Tridimensional Proyecciones Perspectivas: y

PCT

PCI

z

PCD PCP (ZP)

yvmax

C.P.

PCF

yvmin

(yc,zc)

x

PCF (ZF)

(ZF)

PCP (ZP)

z PCB

y

xvmin

xvmax

x

C.P.

(xc,zc)

Para que el punto p1(x1,y1,z1) sea visible debe estar ubicado entre PCT y PCB, entre PCI y PCD y ademas entre PCF(ZF) y PCP(ZP) por lo que el chequeo y su codificacion es una extension del algoritmo de Cohen-Sutherland para recorte 2D. x1<=xdM(z1)+xvmax y x1>=xiM(z1)+xvmin; y1<=ytM(z1)+yvmax y y1>=ybM(z1)+yvmin; z1<=ZP y z1 >=ZF. Asi la secuencia del codigo de region es : FPTBRL

Comp.Grafica II, I.Burgos-Julio/1999


Recorte (Clipping) Tridimensional Programa Clipping en Pascal: Program Clip3d; uses crt; Label Return; Type edge=(left,right,bottom,top,back,front); outcode=set of edge; Var YTM,YBM,XDM,XIM,Xc,Yc,Zc, X1,Y1,Z1,BackZ,FrontZ,X,Y,Z,X2,Y2,Z2, Yvmax,Yvmin,Xvmax,Xvmin, minX,maxX,minY,maxY:real; NumberOne,bandera:boolean; c,c1,c2:outcode; carent:char; Procedure CalcPend; Begin write('Ingresa coordenadas del centro de proyeccion ? - (Xc,Yc,Zc) '); readln(Xc,Yc,Zc); write('Ingresa coordenadas de P1 ? - (X1,Y1,Z1) '); readln(X1,Y1,Z1); write('Ingresa coordenadas de P2 ? - (X2,Y2,Z2) '); readln(X2,Y2,Z2); write('Ingresa valores minimos y maximos de ventana ? - (Xvmin,Xvmax,Yvmin,Yvmax) readln(Xvmin,Xvmax,Yvmin,Yvmax); write('Ingresa coordenadas "Z" de plano frontal y plano posterior ? '); readln(FrontZ,BackZ); (continuaâ&#x20AC;Ś.) Comp.Grafica II, I.Burgos-Julio/1999

');


Recorte (Clipping) Tridimensional Programa Clipping en Pascal: (viene ….) XIM:=(Xc-Xvmin)/Zc; XDM:=(Xc-Xvmax)/Zc; YBM:=(Yc-Yvmin)/Zc; YTM:=(Yc-Yvmax)/Zc; End;{CalcPend} Procedure ValCheq (zeta:real;var Xmin,Xmax,Ymin,Ymax:real); Begin Xmin:=(XIM*zeta)+Xvmin; Xmax:=(XDM*zeta)+Xvmax; Ymin:=(YBM*zeta)+Yvmin; Ymax:=(YTM*zeta)+Yvmax; End;{ValCheq} Procedure Code (x,y,z:real;var c:outcode); var i:byte; opcion:set of edge; Begin c:=[]; if x<minX then c:=[left] else if x>maxX then c:=[right]; if y<minY then c:=c+[bottom] else if y>maxY then c:=c+[top]; if z>BackZ then c:=c+[back] else if z<FrontZ then c:=c+[front]; End;{Code} Function ClippedZ (a1,z1,a2,z2,m,b:real):real; Begin ClippedZ:=((a2-a1)*z1+(b-a1)*(z2-z1))/((a2-a1)-m*(z2-z1)); End;{ClippedZ} (continua….) Comp.Grafica II, I.Burgos-Julio/1999


Recorte (Clipping) Tridimensional Programa Clipping en Pascal: Function ClippedXorY (a1,b1,z1,a2,b2,z2,aclip,zclip:real):real; Begin if z2-z1<> 0.00 then ClippedXorY :=((b2-b1)/(z2-z1))*(zclip-z1)+b1 else if a2-a1<> 0.00 then ClippedXorY:=((b2-b1)/(a2-a1))*(aclip-a1)+b1 else ClippedXorY:=b1; End;{ClippedXorY} Procedure CheqBandera (var x,y,z,xant,yant,zant:real); Begin if not bandera then begin x:=X1; y:=Y1; z:=Z1; xant:=X2; yant:=Y2; zant:=Z2; end {ifnotbandera} else if NumberOne then begin xant:=X1; yant:=Y1; zant:=Z1; end {ifnumberone} else begin xant:=X2; yant:=Y2; zant:=Z2; end;{else} End;{CheqBandera} (continuaâ&#x20AC;Ś.)

Comp.Grafica II, I.Burgos-Julio/1999


Recorte (Clipping) Tridimensional Programa Clipping en Pascal: Procedure CalcLeft (var x,y,z:real); var xclip,yclip,zclip, xant,yant,zant:real; Begin CheqBandera (x,y,z,xant,yant,zant); zclip:= ClippedZ(x,z,xant,zant,XIM,Xvmin); xclip:= (XIM*zclip)+Xvmin; yclip:= ClippedXorY (X1,Y1,Z1,X2,Y2,Z2,xclip,zclip); bandera:=true; x:=xclip; y:=yclip; z:=zclip End;{CalcLeft} Procedure CalcRight (var x,y,z:real); var xclip,yclip,zclip, xant,yant,zant:real; Begin CheqBandera (x,y,z,xant,yant,zant); zclip:= ClippedZ(x,z,xant,zant,XDM,Xvmax); xclip:= (XDM*zclip)+Xvmax; yclip:= ClippedXorY (X1,Y1,Z1,X2,Y2,Z2,xclip,zclip); bandera:=true; x:=xclip; y:=yclip; z:=zclip End;{CalcRight} Procedure CalcBottom (var x,y,z:real); var xclip,yclip,zclip, xant,yant,zant:real; Begin CheqBandera (x,y,z,xant,yant,zant); zclip:= ClippedZ(y,z,yant,zant,YBM,Yvmin); yclip:= (YBM*zclip)+Yvmin; (continuaâ&#x20AC;Ś.) Comp.Grafica II, I.Burgos-Julio/1999


Recorte (Clipping) Tridimensional Programa Clipping en Pascal: xclip:= ClippedXorY (y,x,z,yant,xant,zant,yclip,zclip); bandera:=true; x:=xclip; y:=yclip; z:=zclip End;{CalcBottom} Procedure CalcTop (var x,y,z:real); var xclip,yclip,zclip, xant,yant,zant:real; Begin CheqBandera (x,y,z,xant,yant,zant); zclip:= ClippedZ(y,z,yant,zant,YTM,Yvmax); yclip:= (YTM*zclip)+Yvmax; xclip:= ClippedXorY (y,x,z,yant,xant,zant,yclip,zclip); bandera:=true; x:=xclip; y:=yclip; z:=zclip End;{CalcTop} Procedure CalcBacK (var x,y,z:real); var xclip,yclip,zclip, xant,yant,zant,zchange:real; Begin CheqBandera (x,y,z,xant,yant,zant); zchange:= (BackZ-z)/(z-zant); xclip:= ((x-xant)*(zchange))+x; yclip:= ((y-yant)*(zchange))+y; Zclip:=BackZ; bandera:=true; x:=xclip; y:=yclip; z:=zclip End;{CalcBack} (Continuaâ&#x20AC;Ś.) Comp.Grafica II, I.Burgos-Julio/1999


Recorte (Clipping) Tridimensional Programa Clipping en Pascal: Procedure CalcFront (var x,y,z:real); var xclip,yclip,zclip, xant,yant,zant,zchange:real; Begin CheqBandera (x,y,z,xant,yant,zant); zchange:= (FrontZ-z)/(z-zant); xclip:= ((x-xant)*(zchange))+x; yclip:= ((y-yant)*(zchange))+y; Zclip:=FrontZ; bandera:=true; x:=xclip; y:=yclip; z:=zclip End;{CalcFront} Begin {Prog.Principal} clrscr; CalcPend; ValCheq (z1,minX,maxX,minY,maxY); Code (X1,Y1,Z1,c1); NumberOne:=true; bandera:=false; ValCheq (z2,minX,maxX,minY,maxY); Code (X2,Y2,Z2,c2); NumberOne:=false; bandera:=false; while (c1<>[]) or (c2<>[]) do begin if (c1*c2)<>[] then goto return; c:=c1; if c=[] then c:=c2; (Continuaâ&#x20AC;Ś.)

Comp.Grafica II, I.Burgos-Julio/1999


Recorte (Clipping) Tridimensional Programa Clipping en Pascal: if left in c then CalcLeft (x,y,z) else if right in c then CalcRight(x,y,z) else if bottom in c then CalcBottom(x,y,z) else if top in c then CalcTop(x,y,z) else if back in c then CalcBack(x,y,z) else if front in c then CalcFront(x,y,z); if c=c1 then begin X1:=x; Y1:=y; Z1:=z; ValCheq (z1,minX,maxX,minY,maxY); Code(x,y,z,c1); bandera:=false; NumberOne:=true; end {if c=c1} else (Continuaâ&#x20AC;Ś.)

Comp.Grafica II, I.Burgos-Julio/1999


Recorte (Clipping) Tridimensional Programa Clipping en Pascal: begin X2:=x;Y2:=y; Z2:=z; ValCheq (z2,minX,maxX,minY,maxY); Code(x,y,z,c2); bandera:= false; NumberOne:=false; end {else} end;{while c1 or c2} writeln ('x1= ',X1:10:2,' y1= ',Y1:10:2,' z1= ',Z1:10:2); Writeln ('x2= ',X2:10:2,' y2= ',Y2:10:2,' z2= ',Z2:10:2); writeln(' Presiona cualquier tecla para Seguir....'); carent:=readkey; return:End. {prog.Principal}

Comp.Grafica II, I.Burgos-Julio/1999


OpenGL AnalogĂ­a de la cĂĄmara para la visualizaciĂłn en OpenGL:

Figura

Comp.Grafica II, I.Burgos-Julio/1999

3-1

La comparacion de los procesos ilustra cada uno de los pasos a seguir en una visualizacion en OpenGL, la figura 3-1, emula la camara y la preparacion del ambiente de trabajo en OGL. La figura 3-2 nos indica que se debe contemplar dentro del OGL para tratar la visualizacion 3Dimensional en el orden adecuado. El proceso Modelview Matrix, contempla el viewing y modeling de la figura 3-1, los procesos posteriores siguen la misma secuencia.


OpenGL Programa para generar un cubo. #include <los_programas_headers_que_se_necesiten para windows.h> #include <GL/gl.h> #include <GL/glu.h> #include <GL/glut.h> // este se puede sustituir por el glaux.h void init(void) { glClearColor(0.0,0.0,0.0); glShadeModel(GL_FLAT); } void display (void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0,1.0,1.0); glLoadIdentity(); // aclara la matriz /* viewing */ gluLookAt (0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0); glScalef (1.0,2.0,1.0); // modeling glutWireCube(1.0); // se puede sustituir por la funcion correspondiente del glaux glFlush(); } (continuaâ&#x20AC;Ś..) Comp.Grafica II, I.Burgos-Julio/1999


OpenGL (vieneâ&#x20AC;Ś...) Programa para generar un cubo. void reshape (int w, int h) { glViewport(0,0,(GLsizei) w,(GLsizei) h ); glMatrixMode (GL_PROJECTION); glLoadIdentity(); // aclara la matriz glFrustum(-1.0,1.0,-1.0, 1.0,1.5,20.0); glMatrixMode (GL_MODELVIEW); } main() { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(500,500); glutInitWindowPosition(100,100); glutCreateWindow(argv[0]); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0; } Comp.Grafica II, I.Burgos-Julio/1999


OpenGL Comandos Utiles: void gluLookAt(Gldouble eyex, Gldouble eyey, Gldouble eyez, Gldouble centerx, Gldouble centery, Gldouble centerz, Gldouble upx, Gldouble upy, Gldouble upz); Los argumentos eye* indican la posicion de la camara, center* hacia donde la camara enfoca y up* la orientacion de la camara.

Comp.Grafica II, I.Burgos-Julio/1999


OpenGL Comandos Utiles: void glFrustum(Gldouble left, Gldouble right, Gldouble bottom, Gldouble top, Gldouble near, Gldouble far); Los parametros de esta funcion estan muy relacionados con el volumen de recorte (clipping) tratados con anterioridad.

Comp.Grafica II, I.Burgos-Julio/1999


OpenGL Comandos Utiles: void gluPerspective(Gldouble fovy, Gldouble aspect, Gldouble near, Gldouble far); Esta funcion es exactamente igual a glFrustum(); pero con parametros si se quiere mas intuitivos, vease el grafico para identificar dichos argumentos. La unica acotacion es que el valor de fovy debe estar entre 0 y 180 grados.

Comp.Grafica II, I.Burgos-Julio/1999


OpenGL Comandos Utiles: void glOrtho(Gldouble left, Gldouble right, Gldouble bottom, Gldouble top, Gldouble near, Gldouble far); Esta funcion grafica imรกgenes en proyecciones paralelas, ej: cortes, fachadas, etc. void glOrtho2D(Gldouble left, Gldouble right, Gldouble bottom, Gldouble top); Solo funciona para graficas bidimensionales.

Comp.Grafica II, I.Burgos-Julio/1999


OpenGL Comandos Utiles: void glViewport(Glint x, Glint y, Glsizei width, Glsizei height); Especifica las dimensiones de la ventana de vision, los valores por defecto son los de la resolucion inicial de la pantalla. X y Y son los valores del punto abajo-izquierdo.

Comp.Grafica II, I.Burgos-Julio/1999


OpenGL En la figura 3-17; notamos en el lado izquierdo, una proyecci贸n que relaciona una imagen cuadrada en una ventana cuadrada tambien usando las rutinas : gluPerspective (fovy,1.0,near,far); glViewport(0,0,400,400); En el lado derecho, la ventana ha sido redimensionada a una ventana rectangular, pero la proyecci贸n no se ha modificado. La imagen aparece comprimida a lo largo del eje Y : gluPerspective (fovy,1.0,near,far); glViewport(0,0,400,200); Para evitar distorsiones, es mejor modificar el aspect ratio de la proyecci贸n para coincidir con la ventana de proyecci贸n : gluPerspective (fovy,2.0,near,far); glViewport(0,0,400,200);

Comp.Grafica II, I.Burgos-Julio/1999


OpenGL Stacks de Matrices.Es usado en los casos de modelos jerárquicos y complicados, por ejemplo si se quiere dibujar un auto y sus cuatro ruedas, cada una de las cuales posee a su vez cinco tuercas, y se dispone de una simple rutina para dibujar cada rueda y sus tuercas. Lo que se hace es llamar a la misma rutina cuatro veces cambiando únicamente las diferentes transformaciones que en cada posición toman efecto. En seudocódigo sería : dibuja_auto ( ) ; recordar_posicion ( ) ; trasladar (rueda1) ; dibuja_rueda ( ) ; elimina_ultima_traslacion ( ) ; // por lo que la actual posición regresa al origen del auto recordar_posicion ( ) ; trasladar (rueda2) ; dibuja_rueda ( ) ; elimina_ultima_traslacion ( ) ; // por lo que la actual posición regresa al origen del auto ….. Similarmente para cada rueda, se dibuja la rueda, se recuerda el lugar y se traslada a cada posición las tuercas dibujadas, eliminado así, las transformaciones luego que cada tuerca es dibujada… Ya que cada transformación es almacenada como matrices, el stack provee el mecanismo ideal para hacer las sucesivas operaciones, trasladando y eliminando. Todas las operaciones antes descritas como glLoadMatrix(); glMultMatrix(); glLoadIdentity(); trabajan como la matriz actual, es decir, como la matriz del tope del stack, el control de todo esto se ejecuta con glPushMatrix() y con glPopMatrix(); la primera función coloca la matriz actual en el tope del stack y la segunda función la elimina del tope. Comp.Grafica II, I.Burgos-Julio/1999


OpenGL Stacks de Matrices.De hecho glPushMatrix() significa “recordar_posicion” y glPopMatrix() significa “elimina_ultima_traslacion ” En el siguiente ejemplo se asume la existencia de rutinas de dibujo del auto, ruedas y tuercas : dibuja_rueda_tuerca( ) { long i; dibuja_rueda( ); for(i=0 ; i<5 ; i++) { glPushMatrix( ); glRotatef(72.0*I,0.0,0.0,1.0); glTranslatef(3.0,0.0,0.0) dibuja_tuerca( ); glPopMatrix( ); } } dibuja_auto_rueda_tuerca( ) { dibuja_auto( ); glPushMatrix( ); glTranslatef(40,0,30); // hacia la primera rueda dibuja_rueda_tuerca( ); glPopMatrix( ); (continua…..) Comp.Grafica II, I.Burgos-Julio/1999


OpenGL Stacks de Matrices.(viene…..)

……

glPushMatrix( ); glTranslatef(40,0,-30); // hacia la segunda rueda dibuja_rueda_tuerca( ); glPopMatrix( ); // y asi con el resto de las ruedas…..

} este código asume que los ejes de las ruedas y tuercas son coincidentes con el eje Z, que las tuercas estan espaciadas 72 grados y 3 unidades desde el centro de la rueda y que las ruedas frontales estan a 40 unidades al frente y 30 unidades a la derecha e izquierda del origen del auto. Por lo general el stack de modelaje (glMatrixMode(GL_MODELVIEW)) acumula hasta 32 matrices de 4x4 y el stack de proyecciones (glMatrixMode(GL_PROJECTION)) acumula tan sólo 2 matrices de 4x4. En el primer caso por defecto la primera matriz en el stack es la matriz identidad (glLoadIdentity ( )), por lo cual no es necesaria cargarla al iniciar cualquier proceso, en el segundo caso por la limitación existente de acumulación a dos matrices, es recomendable siempre usar glLoadIdentity ( ); antes de iniciar cualquier operación. …………….

glShadeModel (Glenum mode) ; Los parámetros son GL_SMOOTH y GL_FLAT. Para el primer caso los colores de cada vértice del objeto pueden ser tratados de manera independiente permitiendo a su vez la gradación cromática. Para el segundo caso el tratamiento del color de un vértice en particular se repite en el resto de los vértices.

Comp.Grafica II, I.Burgos-Julio/1999


OpenGL Iluminaci贸n CONCEPTOS.Tipos de Iluminacion: Iluminacion Ambiente: es la luz que proviene de diversas partes dl ambiente y es imposiblde determinar de cual fuente especifica se genera, por lo que se dice parte de todas direcciones. Iluminacion Difusa: es la luz que viene en una sola direccion, es la mas brillante. Sin embargo, luego de refleljarse sobre alguna superficie, produce un efecto parecido al anterior. Iluminacion Especular: Es la que viene de una direccion particular y refleja en una direccion tambien particular. Se puede pensar en especular como brillantez. Por ejemplo: los plasticos y metales tiene un alto componente especular, por otro lado, las tizas y carpetas tiene ninguna. Iluminacion emisiva: Es aquella que se genera seg煤n las caracteristicas del material de la superficie, que recibe las iluminaciones anteriores. Ver ejemplos de esfera y esfera2. glLight{ifv}(Glenum light, Glenum pname, TYPE param); Crea la luz por light,puede ser GL_LIGHT0,.....GL_LIGHT7 (8 en total), las caracteristicas de la luz se defiene por pname (ver tabla), y param indica los valores. glColorMaterial (Glenum face, Glenum mode); Crea las propiedades del material de la superficie, especificada por mode, . Los parametros face son GL_FRONT, GL_BACK, GL_FRONT_AND_BACK (por defecto). Los parametros mode pueden ser GL_AMBIENT, GL_DIFFUSE, GL_AMBIENT_AND_GL_DIFFUSE(defecto), GL_SPECULAR, GL_EMISSION

Comp.Grafica II, I.Burgos-Julio/1999


OpenGL Iluminaci贸n

Comp.Grafica II, I.Burgos-Julio/1999


OpenGL Iluminaci贸n

Comp.Grafica II, I.Burgos-Julio/1999


Course: Computacion Grafica 2