Uploaded by Jaime Berdejo

IG merged

advertisement
vector Tuplasfs
LineLoop
coordenadas
Vertices
std i
vector
for
int izo
tuplazfs
ian
unsigned
ni
coordenadas
int
pushback go.sxcosfiz.oxM
coordenadas
y
PIxilnl 0.5xsinfl2co MPIxiNn1YI
return coordenadas
vector TuplasfscoordenadasVerticesLines unsigned
std i
vector
tuplazfs
ni
coordenadas
pushback I 21.00.041
coordenadas
µ
coordenadas
coordenadas
PIxilnl 0.5xsinfl2co MPIxiNn1yI
pushback go.sxcosfiz.oxM PIxilnl 0.5xsinfl2co MPIxiNn1yI
pushback go.sxcosfiz.oxM
pushback I 21.00.041
coordenadas
return coordenadas
y
void coordenadasVertices
IndicesTriangles
coordenadas
for
coordenadas
unsigned
ir ni
pushback go.sxcosfiz.oxM
ian 1
izo
void coordenadasVerticesIndices
lines
coordenadas
40 itt.it 24
1
0 n
unsigned
n vector Tuplazfs coordenadas
vectoraunsigned indices
l
pushback 20.0.0.041
int i o
coordenadas
for
PIxilnl 0.5xsinfl2co MPIxiNn1YI
i l
indices insert indicesendll
for
l
vector unsigned indices
int
indices insert indicesendo
y
coordenadas
n vectoratuplazfs
pushback 20.0.0.041
int izo
for
unsigned
unsigned
ia n
int
pushback go.sxcosfiz.oxM
izo
ian 1
int
0 ite
indices inserte indicesendes
indices inserte indicesendo
ir
y
uh
indices inserte indicesendo
0
indices inserte indicesendo
111
1.041
indices inserte indicesendo
n
ti
o
PIxilnl 0.5xsinfl2co MPIxiNn1SI
void openglminino MI normalunsigned ni
assert
l
glGetErrorC
static std
vector
tuplazfs
EL NO
ERROR
coordenadas
LineLoop ni
coordenadas
Vertices
void openglminino MI Ind
assert
l
unsigned ni
EL NO
glGetErrorC
static std
vector
static std
vector unsigneds indices
tuplazfs
ERROR
coordenadas
if l coordenadasempty I
coordenadas
VerticesIndices
Triangles n
l
coordenadas indices
void openglminino MD normalunsigned ni
assert
l
glGetErrorC
static std
vector
tuplazfs
EL NO
ERROR
coordenadas
LineLoop ni
coordenadas
Vertices
void openglminino MD Indiunsigned ni
assert
l
EL NO
glGetErrorC
static std
vector
static std
vector unsigneds indices
tuplazfs
ERROR
coordenadas
if l coordenadasempty I
coordenadas
VerticesIndices
Triangles
n
l
coordenadas indices
K
meridianos
y paralelos
evértice intersección
y µ
K celdas
B
cubitospequeños
y
K
K
1024 128MB
Es
Tin
TTE
2K
vértices
212.1KA away 4 2.21K11 4ktrinqu
4 3.2K B
43.4K B
K 16 18KB
K 1024 72Mis
72K B
sup D
4sientenmal Bt 4 sea.mn B
entuma
En
Esta
na
III
nata
t
Mitad devértices quede triángulos
int
numtiras
a11 413t 8mB
183 4 3 2m21B
m
4sientasmal Bt 4sea min B
Bt 8mB
d
ntt m
12m21m
183 4 3 canta B
m
T
El
m
Imita
oponil
o au
tiempo de procesamiento
de tiras detriángulos
malla in
1 5 Aproxun 50 másdememoriaocupa la
con respecto al modelo detirasde triángulos
modelo
del modelo de mallasindexada es aprox la mitadrespecto al
Arial
vector tuplazis generar
unsigned
for
En
unsigned
izo
ion
Itt
c is 0
for unsigned izo ion int l
for unsignedfaith en Htt
if clisa k and pa k
fort to
if I
te tri sinell
tal
i and
tries
tritio
i and
titties
triaca
i and trienios
tricks
i and
tritio
trick
i and trite 1
ari pushback
lijl
Ccitt Ccitt
µ
return ari
trigla
jI
jI
jI
jI
ji
or
or
or
or
Area constmallaInd
floatcalcular
malla
ii
float area 0
f
Tuplas
forI
a vi
int i o
u
irmalla
sizes
triángulos
it
mallavertices mallatriangules tis
1
mallavertices mallatriangulasCisco
mallavertices mallatriangules tis
23
mallavertices mallatriangulesCisco
area
return area
sqrtlu.crosscul.lengthsq.ch
2.0
TÍ
Ta
B
É
x
E
su
x
rota
E
d 10 0.5 01
Occ
0.5
ñ
de d
ñ
10,110
El
II
0
El
d 10 0.5 01
a
dec l
ñ
ñ
E
0.5
dec d
I
E
El
I ta 0 El
El
nodistorsiona
f
Ea
s
ez
b
z
1
Cx
E
r
ext
E
ay sir
nodistorsiona
n
sur
f
f.cz E
G
r
ext
E
La
Crt En
re
E
Ab
Es
W
g
Dec
E
t oy En
b G
n
Ea
ca
l
Occ
ñ
Cats
s
c
s
Occ
n
te
Cytsk
b
ay sie
a
li up
10,201
pimp
a
o
el brilloes máx en p co1,01
cosca 1
Este punto no es visible para el
observador
20,01
copia
li
p
lis como
Ip
µ
K
EEEE
E E
I
E
2
E
OI
01
up IEaEz 01
ri
zlli.nplup.li 21k 111Ea Ea 01 Li
2
01
p O
sí es visible para el
observador
E E
Este punto
el brilloes máx en P
EnE o
24vértices 8.31
siiiiiiii
am
siiiiiiii
iii
iii
siiiiiiii
0,010 40,0 11 20,1101 40.1.14 21.0.04 41,014.41.1.0441,411
0,0101 40,0 11 20,1101 40.1.14 21.0.04 41,014.41.1.0441,411 4
7
4
sentido antihorariodesde fuera
0.3.24
0,1 34
triángulos
Izq dcha
447,54 4 4 6,71
8 13,94
8112,134
10,11 154
4 1015,141
Abajo arriba
16.22.204 416,181224
17.21.234
c tt_ver
t.gl E E
TE
Ej
t
no_Ver
4 17.231194 Y
E El
14
Atrás delante
41,31 I J
I El
41,04
4 1 0,04 4 1 0,04
40 1,04 40 1,04 40 1,04 40
I II
E J4
1,0 04,4 1 0,04
1
1
20
f
El 1,53 E El LEÍ
t
El 20,53 E E
14
1 0,04
f
1 0,04
E Eh Í
O
1
0,04
1.0.0
04,40 1,04 40 1,04 40 1,04 40 1,04
14 40,0
0,0 14 40,0 14 40,0 14 40,0 14 40,0 14,4 0,0 14 40,0
1
s
const s
Void
ti
desplazar
static u
Occ
1
a
1
n
Zec
y
10 1,01
E Oo E 0
E do t.az
Oea a
Ey
tea
III
i
ye
Zec x Tec
ÉI
EE
Va Vo
a
Si
I d
Si
II d to
devolver fase
O
resolver
no loot tdo Vool
nada
nodo
Si te 0
Si t o
Si 7
solución
T
t ta vo
O y sacarte
It I PeVol
malo tal Von
nooo mon
t
yo
t ha losttdaVato
noveo navontravor
nada
nada
devolver fase
to t y resolver Ro Vo
aba0
O e atbe 1
aut bu
devolvertrue
disco
C c
NF
LEI
Si
I
Si
I d to
iii
d
no loot tdo
devolver fase
O
resolver
col
NI Pe CI
malo tal Cnl
nodo
Si te 0
Si t o
yo
nada
iiii
T
tal C
O y sacarte
t ha losttda c o
nada
devolver fase
to t y resolver llRo ell e
r
En casoafirmativo devolvertrue
total
unpuntoPeestáen elrayosi pe Otto tso spe loottdo.onttdn.at
Yestáen start si
1pct
pedirdonde
o
Viper pel r
Flp
Ipecac
Oo Co tdoOn Ca tal o la total
2 OoCo tacit Oral
pelCECI Oo OitOEI Co Cita
ad
attoodo
11011 t
t
2t
Orde
Halt Loc
Fac
b
adit adultildotdidil
codo
atad
atad
t lldi
Ej EE
YÉL
La
ato pues de10.0.01
Si ta ta co
Si ta ta so
Si tiro
no
hay
return
tiro
intersección
pe
return
o t minkti te4 d
p
o
ti d l casoextremo
un puntoPeestáen elrayosi pe Otto tso
Está en Csi Oo
ttdottlattdzt
Y OEOnttd.es Entonces
Fac
b
de 0.1.01 y
Si a o
00
del cilindro
hola I
R
el rayo cortaría al
1 y 0
t 0
tomamos
00.0.021
EEEEE
t
y ÉL
2a
sólo si
q.iq
spe loottdo.onttdn.at
0
si
Cortaría en el punto
te
el primero tal que Onto
100,011021
Si aro sea y
a
cilindro
y
P
01
01101,01
Ont tarde ya Ontteda
Si Os y el y ya 0,13 pe O trd
Si Os y el y Ya 0,13 pe O tad
Si yaya
Y
0,13 no hay
Si Os 1 Yael return
intersección
pe otminkti.tk d
o
Pelottdo.onttdn.attal
un puntoPeestáen elrayosi pe Otto tso
Está en el cono si y sólo si oitoitzcoodotordaltttldoi.de
Oit tan
Ear
be
t
2a
si a o
to
Si aro sea y
y ÉI
osonttd.tt
intersección
Ont tarde ya Ontteda
Si Os y el y ya 1 Pe
Si Os y el y ya 1 Pe
1 ya 1
y
si oeonttd.es
on 00 OI
2100cLaditordal
En otrocaso no hay
Si
t
t atonda es
no
hay
Si Os 1 Yael return
Ottid
Ottad
intersección
pe otminkti.tk d
return PtosOtto
1
O
EjeX E sxttx.sx.tt
Eje Y E sytty sytty
szttz.se te
Eje Z
al
2
settee O
b
carbitt
cases
n
sexta
f
I sita
a
sx
ca b.fi
cabina
ca b ni
Traslación
100 de
o 10 dy
Escalado
sx o o o
o
o
10 a
1 Y
001 de
00
o o o 1
s o o
yo
I
o o sto
1
o o o 1
Rotación
cosasino o
sino cosa o
O
o
a cosa
yo o
o
sysino
sismo sycoso
1
o
o
1
o
a no ser quesusy
Sx o o
o yo
O o
sino
sino cosa o
o
o y
a
a cosa sismo
sysino sycoso
o
o
o
o
1
a GL_LINE LOOP
staticGlenun nombre_vao_O
constunsigned int n 5
std
vectoratuplazas posiciones
forCintio
ian
posiciones
it
pushback Laos
a M PI it In sin a mil ilIn
if nombre_veo 01
nombre_vao CrearVall
else
y
Vertex
Bind
Array nombre_vao
ge
b GL LINES
staticGlenun nombre_vao_O
constunsigned int n 5
std
vectoratuplazas posiciones
forCintio
ian
posiciones
posiciones
it
pushback Laos
a M PI it In sin a mil ilIn
pushback Laos a M PI Iii
Iu sin a mil ti
if nombre_veo 01
nombre_vao CrearVall
else
y
Vertex
Bind
Array nombre_vao
ge
D In
a SECUENCIANOINDEXADI
static Glenun nombre_vao 0
constunsigned int n 5
std
vectoratupla3 s
posiciones
df
for int i O i cn i
back 0.00.00.04
posicionespush
posiciones
pushback Lcos
a M PI
posiciones
pushback Lcos
it In sin 2 M Pi il In 0.04
a M PI
Iii Iu
if nombre_veo 01
nombre_vao CrearVall
É
else
g
geBindVertexArray nombre_vao
posiciones
sin
2 M Pi i 1
n
0.04
b
CONSECUEIAINDEXADA
static Glenun nombre_vao_O
constunsigned int n 5
std
vectoratupla3
std
vector
dfs posiciones
Tuplazas indices
back 40.0.0.00.04
posicionespush
forCintio
ian
posiciones
for int in isn
i
pushback Laos
it
indicespushback
a M PI
it In sin 2 M Pi
i n
0.04
40 i i et.nl
if nombre_veo 01
nombre_vao CrearVall
Crear
V30Atri
blindatrib_posiciones G
CrearUBoInd indices
else
geBindVertexArray nombre_vao
UBLE 2
posiciones
posiciones.sizposiiom.li
void visualizarFrame11 std
using namespace
Sea C
Sea
á_
á
Ax
Ax
iii á ó
OÍ
Ax Ay Az
5
marco
un
y
B
axixtay.ytaz.si
I bx.it by Y b E
ay
h
bx.IgItby
de referencia cartesiano
C
bx.by be 0
bx.jxby.pe
Éi
bz.El
i bx.it by Y bz.tl azfi.Ibx.x by.y
un
marco cartesiano
bz
son perpendiculares
tienen longitud unidad
az.bz
E
ayfbfj.xby.Ijtbztaz.fbx.ifb.az
Los versores de
ax.bxtay.by
ba
Sea C
Ex 5
marco
un
Ax Ay Az 05 y
á_
Sea
Ax
iii á ó
a
I
ay
B
I az.si y x
de referencia cartesiano
C
bx.by be 0
maldad
bx.jtby.pe ba.iq
bz.El
ixlbx.xtby.ytbz.EDtayfyxfbx.itby Y bz.tl azfxbx.x by.y
axfbxIFtbyIxxyl bzli.it ayfbxlixxl
axbyz axbzy
I aybz
Í
bylIibzlixzD azfbx Exxl bylE I bzfif
ayb.isE ay bei
azbxy azbyx
azbyltyfazbx axbzi zfaxby aybxl
aybz.azby
ax
azbx ax be
by aybx
Ix I
D
J
J
Fx É
d
El vinilo que
lo cumplees Ó
Sea C
i I É ó
á_
Sea
Ax Ay Az
Hemos visto
áxb
OÍ
de referencia cartesiano
marco
un
B
y
C
bx.by be 0
que
I aybz azby
I
azbx ax ba
E
axby ay b
Ahora bien
á I
taxi
ay
aybz azby
Y
axfaybz azby
az
E
fi
I
azbx ax ba
aybz azby
E
yfazbx
ay azbx axbzltazlaxby
aabz aafzbytafazbx
Análogo para b
axby ay b
axbz
z axby aybx
aybx
afaxbz.azazaio
Grado en Informática y Matemáticas.
Informática Gráfica. Curso 2014-15. Teoría.
Examen de la convocatoria ordinaria de febrero. Viernes, 6 de Febrero de 2015.
nombre:
apellidos:
e-mail:
1. (2.5 puntos) Dado un cubo de lado 1, con una de sus esquinas en la posición (0,0,0) y otra en (1,1,1) –el resto las
puede usted averiguar fácilmente-, dibuje cómo se vería el cubo (y el origen y los ejes del sistema de coordenadas del
mundo) en un viewport cuadrado si la cámara tiene cada uno de los siguientes conjuntos de parámetros:
(1) O = (0,0,5); VPN = (0,0,1); VUP = (0,1,0)
(2) O = (0,0,5); VPN = (0,0,1); VUP = (0,-1,0)
(3) O = (5,5,5); VPN = (1,1,1); VUP = (0,1,0)
(4) O = (0,5,0); VPN = (0,1,0); VUP = (1,0,0)
(5) O = (5,0,5); VPN = (1,0,1); VUP = (0,1,0)
Suponemos en todos los casos que se usa una proyección paralela (ortográfica), y que el cubo aparece completamente
dentro del viewport, sin recortarse ninguna parte del mismo.
•
O es la posición del observador (origen del sistema de coordenadas de la cámara),
•
VPN es el vector perpendicular al plano de visión (eje Z+ del sistema de coordenadas de la cámara),
•
VUP es el vector que indica el sentido “hacia arriba” (eje Y+ del sistema de coordenadas de cámara)
Respuesta
2. (2.5 puntos) Partiendo de un objeto definido por su tabla de vértices y caras (triángulos), escribir en código C o C++
una función que devuelva el área total del objeto. Usar la fórmula de Herón para el área de un triángulo:
área =
√ s ( s−a)( s−b)(s−c)
donde:
a+b+ c
2
s =
(aquí a, b, y c son las longitudes de cada una de las tres aristas del triángulo)
Respuesta
// se hace como una función que devuelve el área:
float Area( MallaTVT * m )
{
float area = 0.0 ;
// recorremos todas las caras
for( unsigned i = 0 ; i < m->caras.size() ; i++ )
{
// recuperamos las posiciones en WC de los tres vértices
Tupla3f v0 = m->vertices[m->caras[i][0]],
v1 = m->vertices[m->caras[i][1]],
v2 = m->vertices[m->caras[i][2]];
// calculamos a,b,c,s
float
a = (v1-v0).longitud(),
b = (v2-v0).longitud(),
b = (v1-v2).longitud(),
s = 0.5*(a+b+c) ;
// sumamos área del triángulo al área total
area += sqrt( s*(s-a)*(s-b)*(s-c) ) ;
}
return area ;
}
3. (2.5 puntos) Se quiere texturizar una lata formada por un cilindro con una tapa superior (figura de la derecha)
usando una sola imagen (a la izquierda de la figura). Explicar mediante un código en C cómo se han de asignar las
coordenadas de textura a los vértices del objeto (superficie lateral y tapa superior) durante la generación de la tabla de
vértices por revolución, usando N copias de un perfil formado por dos puntos: P1=(r,0,0) y P2=(r,h,0) (siendo r el radio
de la lata, y h su altura). Las coordenadas de textura están en el rango 0-1. Se ha visualizado una cuadrícula de tamaño
4x4 sobre ella. No es necesario indicar como se crean las caras, solo los vértices.
Respuesta
// asumimos que 'n' es una constante con el número de copias del perfil
// que queremos crear (sin incluir la ultima). Se crea solo la tapa de arriba.
// asumimos que 'h' y 'r' son constantes reales predefinidas
std::vector<Tupla3f> ver ;
std::vector<Tupla2f> cct ;
// tabla de posiciones de vértices
// tabla de coordenadas de textura
for( unsigned
{
float f =
a =
c =
x =
//
//
//
//
i = 0 ; i <= n ; i++ )
float(i)/float(n),
2.0*M_PI*f,
cos(a), s = sin(alpha),
r*c, z = r*s ;
// añadir los tres vértices a
ver.push_back( Tupla3f( x, 0,
ver.push_back( Tupla3f( x, h,
ver.push_back( Tupla3f( x, h,
// insertar las coords.
cct.push_back( Tupla2f(
cct.push_back( Tupla2f(
cct.push_back( Tupla2f(
'ver'
z ) );
z ) );
z ) );
fracción de perfiles ya calculados
ángulo del perfil (radianes)
seno y coseno del 'a'
coordenada x,z de los tres vértices
// vértice inferior del cilindro
// vértice superior del cilindro
// vértice en la tapa (misma pos.)
de textura a 'cct'
f, 0.0 ) );
// vértice inferior del cilindro
f, 0.5 ) );
// vértice superior del cilindro
0.25+0.25*c, 0.75+0.25*s ) ); // vértice en la tapa
}
// insertamos vértice en el centro de la tapa superior al final
verts.push_back( Tupla3f( 0.0, h, 0.0 ) );
cct.push_back( Tupla2f( 0.25, 0.75 ) );
4. (2.5 puntos). Supongamos que disponemos de los siguientes dos primitivas geométricas 3D:
•
•
•
Cilindro, sin tapas, de altura y radio unidad, con la base apoyada en el plano XZ y con el centro de la base en
el origen de coordenadas.
Disco: disco plano de radio unidad, perpendicular al eje Y y con el centro en el origen.
Cubo: cubo de lado 2 unidades con centro en el origen.
Con estas tres primitivas queremos construir un modelo de coche como en la figura (vemos el perfil, a la izquierda, y el
alzado, a la derecha). Tiene cuatro ruedas de radio y ancho unidad, así como dos faros delanteros, de radio y ancho 1/2.
El cuerpo está hecho con dos paralelepípedos (el inferior mide 8 x 2 x 4 unidades en X,Y, y Z, respectivamente, y el
superior mide 4 x 2 x 4 unidades).
Como producto de los movimientos del volante, las dos ruedas delanteras giran cada una en torno a un eje vertical
(líneas verticales a rayas de la figura), de forma que el ángulo de rotación será cero en reposo (como en la figura). A
este ángulo lo llamamos ang_giro, y es igual para ambas ruedas. Además, para que el coche pueda rodar, las cuatro
ruedas giran sobre los ejes delantero y trasero del coche (línea a rayas horizontal), de forma solidaria (todas por igual),
según un ángulo (que llamamos ang_rodar.)
4.a. (1.25 punto) dibuja el grafo de escena parametrizado correspondiente al modelo jerárquico del coche (hay dos
grados de libertad: los valores de ang_giro y de ang_rodar).
4.b. (1.25 punto) escribe la función que, invocando a las transformaciones geométricas adecuadas y las funciones de
dibujado del cilindro, disco y cubo, pinte el coche. Dicha función o método se declara de esta forma:
void dibujaCoche( float ang_giro, float ang_rodar ) ;
Respuesta:
Coche( rodar, giro ):
CuerpoSup
CuerpoInf
Faros
ParRuedas( rodar, 0 )
Tra[ 6, 0, 0 ]
ParRuedas( rodar, giro )
CuerpoSup
Tra[ 4, 4, 3 ]
Esc[ 2, 1, 2 ]
Cubo
CuerpoInf
Tra[ 4, 2, 3 ]
Esc[ 4, 1, 2 ]
Cubo
Faros:
Tra[ 8, 2.5, 1.5 ]
Faro
Tra[ 0, 0, 3 ]
Faro
Faro:
Rot[ -90o, Z ]
Esc[ 1/2, 1/2, 1/2 ]
CilindroTapas
ParRuedas( rodar, giro ):
Rueda( rodar, giro )
Tra[ 0, 0, 5 ]
Rueda( rodar, giro )
Rueda( rodar, giro ):
Tra[ 1, 1, 1 ]
Rot[ giro, Y ]
Rot[ -rodar, Z ]
Rot[ 90o, X ]
CilindroTapas
CilindroTapas :
Disco
Cilindro
Tra[ 0, 1, 0 ]
Cilindro
1 Septiembre 2012-2013
Ejercicio 3. Describe brevemente para que sirven, en un programa OpenGL/glut, cada una de
estas cuatro funciones:
a) glutDisplayFunc(funcion);
Esta función se llamará cada vez que se dibuje la ventana.
b) glutReshapeFunc(funcion);
Función de control del cambio de tamaño de la ventana de visualización.
c) glutKeyboardFunc(funcion);
Función de control de eventos con el teclado.
d) glutSpecialFunc(funcion);
Función de control de eventos con el teclado para cuando se ha pulsado una tecla especial.
2 Septiembre 2014
Ejercicio 1. Considera una malla de n triángulos almacenada en memoria con un vector caras
(con n entradas), de forma que caras[i][j] es un entero, en concreto el índice del vértice
número j de la cara número i (con 0 <= i <= n y 0 <= j < 3).
1. Con esta definición, escribe el código de una función con esta declaración:
bool comparten_vertice(int c1, int c2);
que devuelve true cuando las caras número c1 y c2 comparten un vértice (devuelve
false si esto no es así).
bool comparten_vertice(int c1, int c2){
const int NUMERO_VERTICES = 3;
bool comparten_vertice = false;
for (int j = 0; j < NUMERO_VERTICES && !comparten_vertice; ++j){
for (int k = 0; k < NUMERO_VERTICES && !comparten_vertice; ++k){
if (caras[c1][j] == caras[c2][k])
comparten_vertice = true;
}
}
return comparten_vertice;
}
1
2. Escribe el código de otra función:
bool comparten_aristas(int c1, int c2);
que devuelve true cuando las caras número c1 y c2 comparten una arista (devuelve
false si esto no es así).
bool comparten_arista(int c1, int c2){
const int NUMERO_VERTICES = 3;
bool comparten_arista = false;
bool comparten_vertice = comparten_vertice(c1, c2);
int vertice_a;
int vertice_b;
vertice_a = -1;
vertice_b = -1;
if (comparten_vertice){
for (int j = 0; j < NUMERO_VERTICES && !comparten_arista; ++j){
for (int k = 0; k < NUMERO_VERTICES && !comparten_arista; ++k){
if ( caras[c1][j] == caras[c2][k] && vertice_a == vertice_b )
vertice_a = caras[c1][j];
else if ( caras[c1][j] == caras[c2][k] && vertice_a != vertice_b )
comparten_arista = true;
}
}
}
return comparten_arista;
}
2
Download