Computacion Grafica 2
-
Upload
ivan-burgos -
Category
Documents
-
view
240 -
download
0
description
Transcript of Computacion Grafica 2
COMPUTACION GRAFICA IICOMPUTACION GRAFICA II(7050160100642)->M(7050160100642)->M(7050150100642)->E(7050150100642)->E
Prof.: Arq.Iván Burgos, Mg.Sc.Prof.: Arq.Iván Burgos, Mg.Sc.(Ing.Luz-1989)(Ing.Luz-1989)
Julio, 1999Julio, 1999
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
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.Addison-
Wesley Publisher, 1995.
COMPUTACION GRAFICA IICOMPUTACION GRAFICA II
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Representación Gráfica TridimensionalRepresentación Gráfica Tridimensional
P1P1
x1x1y1y1
Representación Representación matricialmatricialdel Punto P1:del Punto P1:
x1 x1 y1 y1 z1 z1
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
z1z1
NOTA: Observese el sentido positivo del eje Z,NOTA: Observese el sentido positivo del eje Z,es Mano Derecha.es Mano Derecha.
Representación Gráfica TridimensionalRepresentación Gráfica Tridimensional
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Sentido Mano DerechaSentido Mano Derecha(usado por el OpenGL)(usado por el OpenGL)
Sentido Mano IzquierdaSentido Mano Izquierda(Según Monitor)(Según Monitor)
Representación Gráfica TridimensionalRepresentación Gráfica Tridimensional
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Objetos Transparentes (Wire Frame)Objetos Transparentes (Wire Frame)
Objetos SolidosObjetos Solidos
Técnicas Tridimensionales de Técnicas Tridimensionales de RepresentaciónRepresentación
Proyecciones Paralelas:Proyecciones Paralelas:
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
P1P1
P2P2
P1’P1’
P2´P2´
Plano de ProyeccionPlano de Proyeccion
Centro de Proyeccion en Centro de Proyeccion en
Técnicas Tridimensionales de Técnicas Tridimensionales de RepresentaciónRepresentación
Proyecciones Perspectivas:Proyecciones Perspectivas:
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
P1P1
P2P2
P1’P1’
P2´P2´
Plano de ProyeccionPlano de Proyeccion
Centro de ProyeccionCentro de Proyeccion
Criterios de Representación Criterios de Representación TridimensionalTridimensional
Siempre Objetos ConvexosSiempre Objetos Convexos. Los cuales son representados a . Los cuales son representados a su vez por conjuntos de planos o poligonos.su vez por conjuntos de planos o poligonos.Lo usual es almacenar la informacion en tres arreglos: Lo usual es almacenar la informacion en tres arreglos: Vertices, Bordes o Lineas y Poligonos o Superficies.Vertices, Bordes o Lineas y Poligonos o Superficies.
v1v1 x1x1 y1y1 z1z1 E1E1 v1v1 v2v2v2v2 x2x2 y2y2 z2z2 E2E2 v2v2 v3v3v3v3 x3x3 y3y3 z3z3 E3E3 v3v3 v1v1v4v4 x4x4 y4y4 z4z4 E4E4 v3v3 v4v4v5v5 x5x5 y5y5 z5z5 E5E5 v4v4 v5v5
E6E6 v5v5 v2v2
s1s1 e1e1 e2e2 e3e3s2s2 e2e2 e4e4 e5e5
e6e6
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
v1v1
v2v2
v3v3v4v4
v5v5s1s1 s2s2e1e1
e2e2
e3e3
e6e6
e5e5e4e4
ECUACIONES VARIAS.-ECUACIONES VARIAS.-La orientacion de un plano se determina por el Vector La orientacion de un plano se determina por el Vector Normal (DN) a ese plano.Normal (DN) a ese plano.
Comp.Grafica I, I.Burgos-Julio/1999Comp.Grafica I, I.Burgos-Julio/1999
Criterios de Representación Criterios de Representación TridimensionalTridimensional
xx
yy
zz
DxN,DyN,DzNDxN,DyN,DzNAsi, si el punto esta en el plano,Asi, si el punto esta en el plano,satisface la igualdad:satisface la igualdad:Ax+By+Cz+D=0;Ax+By+Cz+D=0;de donde cualquier punto fuera del de donde cualquier punto fuera del plano cumple la siguiente desigualdadplano cumple la siguiente desigualdadAx+By+Cz+D<>0;Ax+By+Cz+D<>0;Cualquier punto del lado dentro Cualquier punto del lado dentro del plano produce un valor negativodel plano produce un valor negativopara Ax+By+Cz+D; y en casopara Ax+By+Cz+D; y en casocontrario produce valor positivo.contrario produce valor positivo.
xP,yP,zPxP,yP,zP
ECUACIONES VARIAS.-ECUACIONES VARIAS.-Productos Vectoriales.Productos Vectoriales.
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Criterios de Representación Criterios de Representación TridimensionalTridimensional
Sean Sean v1v1=(x1,y1,z1) y =(x1,y1,z1) y v2v2=(x2,y2,z2), =(x2,y2,z2), el producto punto viene dado por:el producto punto viene dado por:v1.v2=x1x2+y1y2+z1z2v1.v2=x1x2+y1y2+z1z2, el producto , el producto punto no es vector sino un numero realpunto no es vector sino un numero real(escalar), por lo que en forma vectorial :(escalar), por lo que en forma vectorial :v1.v2=|v1| |v2| x cos θv1.v2=|v1| |v2| x cos θ,,de donde si v1 y v2 forman un angulo de donde si v1 y v2 forman un angulo recto entonces el producto punto =0recto entonces el producto punto =0
El El Producto CruzadoProducto Cruzado de los vectores de los vectores v1v1 y y v2v2 es otro es otrovector:vector:v1 x v2 = (y1z2-z1y2,z1x2-x1z2,x1y2-y1x2)v1 x v2 = (y1z2-z1y2,z1x2-x1z2,x1y2-y1x2)el producto cruzado de dos vectores no paralelos es un vector perpendicular a ambosel producto cruzado de dos vectores no paralelos es un vector perpendicular a ambos
θθ
v2v2
v1v1
Matrices y TransformacionesMatrices y TransformacionesPara la representacion matricial tridimensional, se utiliza el Para la representacion matricial tridimensional, se utiliza el mismo criterio de la bidimensional: [ x y z ] => [x y z 1]mismo criterio de la bidimensional: [ x y z ] => [x y z 1]
de donde la matriz general de 4 x 4 de transformaciones de donde la matriz general de 4 x 4 de transformaciones tridimensionales es:tridimensionales es: a b c p a b c p 3 x33 x3 3x1 3x1
d e f g d e f g Transf.LinealesTransf.Lineales Proy.PerspectivasProy.Perspectivas
h i j n h i j n 1x31x3 1x11x1
l m n s l m n s TraslacionTraslacionEscalam.GeneralEscalam.General
Esto nos brinda la posibilidad de multiples combinacionesEsto nos brinda la posibilidad de multiples combinaciones
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Matrices y TransformacionesMatrices y TransformacionesTraslacion:Traslacion:
x’=x+lx’=x+ly’=y+my’=y+mz’=z+nz’=z+n
matriz de transformacion de traslacion:matriz de transformacion de traslacion:
1 0 0 0 1 0 0 0 0 1 0 00 1 0 00 0 1 0 0 0 1 0 l m n l m n 11
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Rotacion:Rotacion:en X:en X: en Y:en Y: en Z:en Z:1 0 0 01 0 0 0 cos(φ) 0 -sen(φ) 0 cos(φ) 0 -sen(φ) 0 cos(ψ) sen(ψ) 0 0 cos(ψ) sen(ψ) 0 00 cos(0 cos() sen() sen() 0 ) 0 0 0 1 0 0 1 0 0 -sen(ψ) cos(ψ) 0 0 -sen(ψ) cos(ψ) 0 00 -sen(0 -sen() cos() cos() 0) 0 sen(φ) 0 cos(φ) 0 sen(φ) 0 cos(φ) 0 0 0 0 1 0 0 1 0 0 0 0 10 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1
Matrices y TransformacionesMatrices y TransformacionesEscalamiento Local:Escalamiento Local:x’=x*Sxx’=x*Sxy’=y*Syy’=y*Syz´=z*Szz´=z*Szsi Sx=Sy=Sz>1 aumentasi Sx=Sy=Sz>1 aumentasi Sx=Sy=Sz<1 disminuyesi Sx=Sy=Sz<1 disminuye
matriz escalamiento local:matriz escalamiento local:Sx 0 0 0Sx 0 0 00 Sy 0 00 Sy 0 00 0 Sz 00 0 Sz 00 0 0 10 0 0 1
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Escalamiento General:Escalamiento General:matriz escalamiento General:matriz escalamiento General:1 0 0 01 0 0 00 1 0 00 1 0 00 0 1 00 0 1 00 0 0 S0 0 0 S
Al establecer esta operación se debeAl establecer esta operación se debenormalizar la matriz resultante:normalizar la matriz resultante:x/s, y/s, z/s, s/sx/s, y/s, z/s, s/s
Matrices y TransformacionesMatrices y TransformacionesReflexiones:Reflexiones:Matriz Reflexion en XY:Matriz Reflexion en XY: 1 0 0 01 0 0 0
0 1 0 00 1 0 00 0 -1 00 0 -1 00 0 0 10 0 0 1
en YZ:en YZ: -1 0 0 0-1 0 0 0 0 1 0 00 1 0 0 0 0 1 00 0 1 0 0 0 0 10 0 0 1
en XZ: en XZ: 1 0 0 0 1 0 0 0 0 -1 0 00 -1 0 0 0 0 1 00 0 1 0 0 0 0 10 0 0 1
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Matrices y TransformacionesMatrices y TransformacionesRotacion en Pivote Arbitrario:Rotacion en Pivote Arbitrario:
Concatenacion de matrices (recordar el PushMatrix y Concatenacion de matrices (recordar el PushMatrix y PopMatrix del OpenGL), PopMatrix del OpenGL), Se sigue el mismo procedimiento de 2Dim.Se sigue el mismo procedimiento de 2Dim. Rota (ψ)= Mtrasl*RotaX*RotaY*RotaZ*RotaYRota (ψ)= Mtrasl*RotaX*RotaY*RotaZ*RotaY-1-1*RotaX*RotaX-1-1*Mtrasl*Mtrasl-1-1
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Escalamiento en Pivote Arbitrario:Escalamiento en Pivote Arbitrario:Se sigue el mismo procedimiento de 2DimSe sigue el mismo procedimiento de 2Dim Matriz Concatenada:Matriz Concatenada:
sX 0 0 0sX 0 0 00 sY 0 00 sY 0 00 0 sZ 00 0 sZ 0(1-sX)*l (1-sY)*m (1-sZ)*n 1(1-sX)*l (1-sY)*m (1-sZ)*n 1
Ocultamiento de SuperficiesOcultamiento de Superficies
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Existen varios algoritmos que tratan el problema del Existen varios algoritmos que tratan el problema del ocultamiento de superficies,ocultamiento de superficies, el tratado en este punto es el mas basico y elemental. Los el tratado en este punto es el mas basico y elemental. Los objetos estudiados objetos estudiados deben ser de tipo convexo. Para tratar un objeto concavo debe deben ser de tipo convexo. Para tratar un objeto concavo debe subdividirse en subdividirse en varios menores de tipo convexo.varios menores de tipo convexo.El criterio primario para ocultar superficies es determinar la El criterio primario para ocultar superficies es determinar la normal al plano en estudiocon respecto al vector constituido normal al plano en estudiocon respecto al vector constituido por el observadorLa operación esta dada por el producto por el observadorLa operación esta dada por el producto cruzado de los dos vectores que determinan un tercero.cruzado de los dos vectores que determinan un tercero.Con los lados o bordes del plano se conocen dos vectores del 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 plano y con la operación entre ellos se determina el normal el cual a su vez se compara con el vector observador y cual a su vez se compara con el vector observador y dependiendo de su angulo (- 0 +) se establece que superficie o dependiendo de su angulo (- 0 +) se establece que superficie o cara se ve y cual no. cara se ve y cual no.
Ocultamiento de SuperficiesOcultamiento de Superficies
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
pp
R (Vector Normal al plano)R (Vector Normal al plano)
Con los bordes se determinan los Con los bordes se determinan los dos vectores en el plano (p y q)dos vectores en el plano (p y q)R=¦p¦ ¦q¦ *sen(θ)=pxqR=¦p¦ ¦q¦ *sen(θ)=pxq[Rx,Ry,Rz]=[px,py,pz]x[qx,qy,qz][Rx,Ry,Rz]=[px,py,pz]x[qx,qy,qz]Rx=pyqz-pzqyRx=pyqz-pzqyRy=pzqx-pxqzRy=pzqx-pxqzRz=pxqy-pyqxRz=pxqy-pyqx
El proximo paso es El proximo paso es comparar el angulo comparar el angulo formado por el vector formado por el vector observador y la observador y la normal al plano, si el normal al plano, si el valor es negativo la valor es negativo la cara no se ve, caso cara no se ve, caso contrario se vecontrario se ve
OBSERVADOROBSERVADOR(Obx,Oby,Obz)(Obx,Oby,Obz)
NORMAL AL NORMAL AL PLANO (R)PLANO (R)
aaa=R.OBSERVADOR;a=R.OBSERVADOR;a=RxObx+RyOby+RzObza=RxObx+RyOby+RzObzel vector OBSERVADOR se determina el vector OBSERVADOR se determina por las coordenadas del OBSERVADOR por las coordenadas del OBSERVADOR y un punto cualquiera del plano. y un punto cualquiera del plano. Ejemplo:un verticeEjemplo:un vertice
Recorte (Clipping) TridimensionalRecorte (Clipping) Tridimensional
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Basicamente repite el esquema 2D pero con la sensacion de Basicamente repite el esquema 2D pero con la sensacion de profundidad, es por ello importante el valor de la coordenada Z. profundidad, es por ello importante el valor de la coordenada Z. Para Proyecciones Axonometricas el asunto es sencillo pues es Para Proyecciones Axonometricas el asunto es sencillo pues es la coordenada Z, la que marca la pauta.la coordenada Z, la que marca la pauta.
objetoobjeto
ZV (plano clip)ZV (plano clip)
zob1zob1 zob2zob2
Lineas proyeccionLineas proyeccionYY
ZZXX
Zob1>ZVZob1>ZV
objetoobjeto
ZV (plano clip)ZV (plano clip)
zob1zob1 zob2zob2
YY
ZZXX
anterioranterior posteriposterioror
Zob1<ZVZob1<ZV
Recorte (Clipping) TridimensionalRecorte (Clipping) Tridimensional
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Para Perspectivas se proyectan los rayos del C.P. Pasando a Para Perspectivas se proyectan los rayos del C.P. Pasando a traves de una ventana que forma la piramide de base cuadrada traves de una ventana que forma la piramide de base cuadrada (o rectangular), generando asi un volumen de clipping, dentro (o rectangular), generando asi un volumen de clipping, dentro del cual los objetos se ven total o parcialmente o no se vendel cual los objetos se ven total o parcialmente o no se ven
ventanaventanaVolumen de clippingVolumen de clipping
FondoFondoFrenteFrente
C.P.C.P.
Recorte (Clipping) TridimensionalRecorte (Clipping) Tridimensional
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Proyecciones Paralelas:Proyecciones Paralelas:
xx zz
yy
yvmaxyvmax
yvminyvmin
PCT(tope)PCT(tope)
PCB(base)PCB(base)
Direccion del vector : ylp/zlpDireccion del vector : ylp/zlp
Cualquier punto (x,y,z)en esa linea inclinada cumple que:Cualquier punto (x,y,z)en esa linea inclinada cumple que:y/z=ylp/zlp,y/z=ylp/zlp,la ecuacion de la recta del punto con la inclinacion sera:la ecuacion de la recta del punto con la inclinacion sera:yytt=ylp/zlp (z)+yvmax; que es la ecuacion del plano=ylp/zlp (z)+yvmax; que es la ecuacion del plano
Recorte (Clipping) TridimensionalRecorte (Clipping) Tridimensional
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Proyecciones Paralelas:Proyecciones Paralelas:
xx zz
yy
yvmaxyvmax
yvminyvmin
PCT(tope)PCT(tope)
PCB(base)PCB(base)
Direccion del vector : ylp/zlpDireccion del vector : ylp/zlp
yybb=ylp/zlp (z)+yvmin; =ylp/zlp (z)+yvmin; xxdd=xlp/zlp (z)+xvmax;=xlp/zlp (z)+xvmax;xxii=xp/zlp (z)+xvmin;=xp/zlp (z)+xvmin;
Recorte (Clipping) TridimensionalRecorte (Clipping) Tridimensional
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Proyecciones Paralelas:Proyecciones Paralelas:
ym=ylp/zlp ; ym=ylp/zlp ; xm=xlp/zlp ;xm=xlp/zlp ;entonces :entonces :yt=ym(z)+yvmax ;yt=ym(z)+yvmax ;yb=ym(z)+yvmin;yb=ym(z)+yvmin;xd=xm(z)+xvmax;xd=xm(z)+xvmax;xi=xm(z)+xvmin.xi=xm(z)+xvmin.
Recorte (Clipping) TridimensionalRecorte (Clipping) Tridimensional
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Proyecciones Perspectivas:Proyecciones Perspectivas:
xx zz
yy
yy xx
zz
PCBPCB
PCTPCT
PCFPCF(ZF)(ZF)
PCPPCP(ZP)(ZP)
yvminyvmin
yvmaxyvmax
C.P.C.P.(yc,zc)(yc,zc)
PCIPCI PCDPCD
PCFPCF(ZF)(ZF)
PCPPCP(ZP)(ZP)
xvmaxxvmaxxvminxvmin
C.P.C.P.(xc,zc)(xc,zc)
Cualquier punto (p) para, por ejemplo, la linea (plano)PCT cumple (y,z)=(yvmax,0), unido con C.P.(centro Cualquier punto (p) para, por ejemplo, la linea (plano)PCT cumple (y,z)=(yvmax,0), unido con C.P.(centro proyeccion)proyeccion)(y,z)=(yc,zc), igualando ambas ecuaciones en la ecuacion de la recta se tiene: (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:yt=(yc-yvmax/zc)*z+yvmax ; asi para la base se tiene:yb=(yc-yvmin/zc)*z+yvmin ; para el lado derecho:yb=(yc-yvmin/zc)*z+yvmin ; para el lado derecho:xd=(xc-xvmax/zc)*z+xvmax ; para el lado izquierdo:xd=(xc-xvmax/zc)*z+xvmax ; para el lado izquierdo:xi=(xc-xvmin/zc)*z+xvminxi=(xc-xvmin/zc)*z+xvminsimplificando la pendiente del plano respectivo:simplificando la pendiente del plano respectivo:ytM=(yc-yvmax/zc) ; ybM=(yc-yvmin/zc) ; xdM=(xc-xvmax/zc) ; xiM =(xc-xvmin/zc) ;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.que a su vez son las pendientes de los planos PCT,PCB,PCD,PCI respectivamente.
Recorte (Clipping) TridimensionalRecorte (Clipping) Tridimensional
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Proyecciones Perspectivas:Proyecciones Perspectivas:
xx zz
yy
yy xx
zz
PCBPCB
PCTPCT
PCFPCF(ZF)(ZF)
PCPPCP(ZP)(ZP)
yvminyvmin
yvmaxyvmax
C.P.C.P.(yc,zc)(yc,zc)
PCIPCI PCDPCD
PCFPCF(ZF)(ZF)
PCPPCP(ZP)(ZP)
xvmaxxvmaxxvminxvmin
C.P.C.P.(xc,zc)(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 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-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.Sutherland para recorte 2D.x1<=xdM(z1)+xvmax y x1>=xiM(z1)+xvmin;x1<=xdM(z1)+xvmax y x1>=xiM(z1)+xvmin;y1<=ytM(z1)+yvmax y y1>=ybM(z1)+yvmin;y1<=ytM(z1)+yvmax y y1>=ybM(z1)+yvmin;z1<=ZP y z1 >=ZF.z1<=ZP y z1 >=ZF.Asi la secuencia del codigo de region es :Asi la secuencia del codigo de region es :F P T B R LF P T B R L
Recorte (Clipping) TridimensionalRecorte (Clipping) Tridimensional
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Programa Clipping en Pascal: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….)
Recorte (Clipping) TridimensionalRecorte (Clipping) Tridimensional
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Programa Clipping en Pascal: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….)
Recorte (Clipping) TridimensionalRecorte (Clipping) Tridimensional
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Programa Clipping en Pascal: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….)
Recorte (Clipping) TridimensionalRecorte (Clipping) Tridimensional
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Programa Clipping en Pascal: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….)
Recorte (Clipping) TridimensionalRecorte (Clipping) Tridimensional
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Programa Clipping en Pascal: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….)
Recorte (Clipping) TridimensionalRecorte (Clipping) Tridimensional
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Programa Clipping en Pascal: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….)
Recorte (Clipping) TridimensionalRecorte (Clipping) Tridimensional
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Programa Clipping en Pascal: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….)
Recorte (Clipping) TridimensionalRecorte (Clipping) Tridimensional
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Programa Clipping en Pascal: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}
OpenGLOpenGL
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
Analogía de la cámara para la visualización en OpenGL:
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.Figura 3-1
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
OpenGLOpenGLPrograma 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…..)
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
OpenGLOpenGL(viene…...)
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/1999Comp.Grafica II, I.Burgos-Julio/1999
OpenGLOpenGL
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.
Comandos Utiles:Comandos Utiles:
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
OpenGLOpenGL
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.
Comandos Utiles:Comandos Utiles:
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
OpenGLOpenGL
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.
Comandos Utiles:Comandos Utiles:
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
OpenGLOpenGL
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.
Comandos Utiles:Comandos Utiles:
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
OpenGLOpenGL
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.
Comandos Utiles:Comandos Utiles:
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
OpenGLOpenGLEn 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/1999Comp.Grafica II, I.Burgos-Julio/1999
OpenGLOpenGL
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 autorecordar_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.
Stacks de Matrices.-Stacks de Matrices.-
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
OpenGLOpenGL
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 ruedadibuja_rueda_tuerca( );
glPopMatrix( );
(continua…..)
Stacks de Matrices.-Stacks de Matrices.-
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
OpenGLOpenGL
(viene…..)glPushMatrix( );
glTranslatef(40,0,-30); // hacia la segunda ruedadibuja_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.
Stacks de Matrices.-Stacks de Matrices.-
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
OpenGLOpenGL
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
Iluminación Iluminación
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
OpenGLOpenGLIluminación Iluminación
Comp.Grafica II, I.Burgos-Julio/1999Comp.Grafica II, I.Burgos-Julio/1999
OpenGLOpenGLIluminación Iluminación