coordenadas homogéneas y transformaciones - …f1a-libretti.pdf · transformaciones daniel fariña...

23
Coordenadas Homogéneas y Transformaciones Daniel Fariña 06-39509 Laura Libretti 06-39796 Computación Gráfica I

Upload: ngothien

Post on 19-Sep-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

Coordenadas Homogéneas y

Transformaciones

Daniel Fariña 06-39509

Laura Libretti 06-39796

Computación Gráfica I

Transformaciones

Las transformaciones se usan para:

o Posicionar objetos en escena

o Cambiar la forma de los objetos

o Crear copias de objetos

o Definir la proyección de la cámara virtual

o Animaciones

Coordenadas Homogéneas

Este sistema es necesario para poder integrar la traslación con la

rotacion y escala.

El uso de las coordenadas homogéneas permite tratar todas las

transformaciones geométricas como multiplicación de

matrices.

Se introduce una cuarta coordenada.

w=1′ x

′ y

′ z

′ w

=

a b c d

e f g h

i j k l

m n o p

x

y

z

w

′ x

′ y

′ z

1

=

a b c d

e f g h

i j k l

0 0 0 1

x

y

z

1

′ p = M ⋅ p

Translación 2D

Reposiciona un objeto desplazándolo a nuevas coordenadas.

En forma matricial:

En una transformación rígida el objeto no se deforma.

• Transladar línea :

– Transladamos sus extremos.

• Transladar polígonos:

– Transladamos véstices y redibujamos.

x′ = x + tx

y'= y + ty

P = (x,y) ′ P = ( ′ x , ′ y ) T = (tx,ty )

′ P = P + T

Translación Homogénea

′ x

′ y

′ z

φ

=

1 0 0 tx

0 1 0 ty

0 0 1 tz

0 0 0 1

x

y

z

1

Rotación con respecto al origen

La posición del punto es rotada alrededor del origen de

coordenadas.

En forma matricial:

x = R ⋅ cosαy = R ⋅ sinα

P = (x,y) ′ P = ( ′ x , ′ y ) R =cosθ sinθ−sinθ cosθ

′ x = R ⋅ cos(α + θ) = ...= x ⋅ cosθ − y ⋅ sinθ′ y = R ⋅ sin(α + θ) = ...= x ⋅ sinθ + y ⋅ cosθ

′ P = P ⋅ R

Rotación General

Fórmula general cuando el punto sobre el cual se rota no es el

origen, sino un punto cualquiera ( Xc , Yc ).

Matrices homogéneas básicas de rotación:

′ x = xc + (x − xc ) ⋅ cosθ − (y − yc ) ⋅ sinθ′ y = yc + (x − xc ) ⋅ sinθ + (y − yc ) ⋅ cosθ

T(x,α) =

1 0 0 0

0 cosα −sinα 0

0 sinα cosα 0

0 0 0 1

T(y,φ) =

cosφ 0 sinφ 0

0 1 0 0

−sinφ 0 cosφ 0

0 0 0 1

T(z,θ) =

cosθ −sinθ 0 0

sinθ cosθ 0 0

0 0 1 0

0 0 0 1

Rotación General

Sobre cualquier eje dado por el vector

unitario ( kx , ky , kz ).

Con: y c = cosθ s = sinθ

′ x

′ y

′ z

1

=

kxkx (1− c) + c kzkx (1− c) − kzs kxkz (1− c) + kys 0

kykx (1− c) + kzs kzkx (1− c) + c kykz (1− c) − kxs 0

kzkx (1− c) − kys kzkx (1− c) + kxs kzkz(1− c) + c 0

0 0 0 1

x

y

z

1

Escalado con respecto al origen

La posición del punto se multiplica por una constante.

En forma matricial:

Escalado uniforme: Sx == Sy

Escalado diferencial: Sx != Sy

P = (x,y) ′ P = ( ′ x , ′ y )

′ x = Sx ⋅ x

′ y = Sy ⋅ y

S =Sx 0

0 Sy

′ P = P ⋅ S

Escalado General

• Si el origen de coordenadas no se encuentra en el interior del

objeto, se produce un desplazamiento.

Se usa un punto fijo y se escala a partir de él.

Matriz homogénea de escalado uniforme desde el origen:

′ x = xc + Sx ⋅ (x − xc )

′ y = yc + Sy ⋅ (y − yc )

′ x

′ y

′ z

1

=

Sx 0 0 0

0 Sy 0 0

0 0 Sz 0

0 0 0 1

x

y

z

1

Composición de Transformaciones

Para cualquier secuencia de transformaciones, podemos calcular

la matriz de transformacion compuesta, calculando el producto

de las transformaciones individuales.

Translaciones sucesivas:

′ P = P ⋅ T1(tx1,ty1)

′ ′ P = ′ P ⋅ T2(tx2,ty2)

′ ′ P = ′ P ⋅ T2 = P ⋅ T1T2 = P ⋅ T

T =1 0 0

0 1 0

tx1 ty1 1

⋅1 0 0

0 1 0

tx2 t y2 1

=1 0 0

0 1 0

tx1 + tx2 ty1 + ty2 1

Composición de Transformaciones

Rotaciones sucesivas:

′ P = P ⋅ R(θ)

′ ′ P = ′ P ⋅ R(α)

′ ′ P = ′ P ⋅ R(α) = P ⋅ R(θ)R(α) = P ⋅ R

R =cosθ sinθ 0

−sinθ cosθ 0

0 0 1

cosα sinα 0

−sinα cosα 0

0 0 1

=cos(θ + α) sin(θ + α) 0

−sin(θ + α) cos(θ + α) 0

0 0 1

Composición de Transformaciones

Escalados sucesivos:

′ P = P ⋅ S1(sx1,sy1)

′ ′ P = ′ P ⋅ S2(sx2,sy2)

′ ′ P = ′ P ⋅ S2 = P ⋅ S1S2 = P ⋅ S

S =Sx1 0 0

0 Sy1 0

0 0 1

Sx2 0 0

0 Sx2 0

0 0 1

=Sx1 ⋅ Sx2 0 0

0 Sy1 ⋅ Sy2 0

0 0 1

Composición de Transformaciones

En general

Es posible combinar transformaciones, multiplicando las matrices

correspondientes.

El producto matricial NO es conmutativo:

Ej: rotar y después transladar ≠ transladar y después rotar

Rotación > Translación:

Translación > Rotación:

T((x,α), p) =

1 0 0 px

0 cosα −sinα py

0 sinα cosα pz

0 0 0 1

T(p(x,α)) =

1 0 0 px

0 cosα −sinα py ⋅ cosα − pz ⋅ sinα0 sinα cosα py ⋅ sinα + pz ⋅ cosα0 0 0 1

Rotación alrededor de un punto

Para hacer una rotación general, podemos hacerlo mediante una

composición de transformaciones básicas.

′ P = P ⋅ T(−xc,−yc ) ⋅ R(θ) ⋅ T(xc,yc )

Escalado alrededor de un punto

Para hacer una escalado general, podemos de igual manera.

′ P = P ⋅ T(−xc,−yc ) ⋅ S(sx,sy ) ⋅ T(xc,yc )

Sobre el eje x Sobre el eje y

Sobre el origen de coordenadas Sobre la recta y=x

Reflexión

1 0 0

0 −1 0

0 0 1

−1 0 0

0 1 0

0 0 1

−1 0 0

0 −1 0

0 0 1

0 1 0

1 0 0

0 0 1

Sobre una recta y=mx+b

Reflexión General

′ P = P ⋅ T(0,−b) ⋅ R(−arctanm) ⋅ F ⋅ R(arctanm) ⋅ T(0,b)

Matrices de Transformación (OpenGL)

Inicialización:

• glMatrixMode(GL_MODELVIEW);

– Para activar la matriz de transformación

• glLoadIdentity( );

– Para cargar la identidad y así poder hacer todas las transformaciones

Transformaciones:

• glScalef(GLfloat sx, GLfloat sy, GLfloat sz);

– Escalar según los factores sx, sy y sz

• glTranslatef(GLfloat tx, GLfloat ty, GLfloat tz);

– Transladar según los factores tx, ty y tz

• glRotatef(GLfloat angulo, GLfloat vx, GLfloat vy, Glfloat vz);

– Rotar angulo según el eje que define el vector (vx, vy, vz)

Matrices de Transformación (OpenGL)

Ejemplo:

Display( ){

glMatrixMode(GL_MODELVIEW);

glLoadIdentity( );

glTranslatef(0.0, 0.0, -5.0);

glRotatef(45.0, 0.0, 0.0);

glScalef(2.0, 2.0, 2.0);

DrawCube( );

}

Matrices de Transformación (OpenGL)

OpenGL permite guardar el estado de la matriz para luego volver a

utilizarlo de la siguiente manera:

• glPushMatrix( );

– Salva el estado actual de la matriz

• glPopMatrix( );

– Recupera el estado de la matriz

Matrices de Transformación (OpenGL)

transform robot

glPushMatrix( );

transform head

draw head

glPopMatrix( );

glPushMatrix( );

transformbody

glPushMatrix( );

transform left-arm

draw left-arm

glPopMatrix( );

glPushMatrix( );

transform right-arm

draw right-arm

glPopMatrix( );

draw body

glPopMatrix( );

Ejemplo:Robot simple con cabeza,Cuerpo y brazos.

Bibliografía

Para la realización de esta presentación se utilizaron las siguientes

fuentes:

• Prof. Eduardo Fernández de la Facultad de Ing. de la

Universidad de la República, Montevideo, Uruguay.

• Clases del Departamento de Arquitectura y Tecnología de

Computadores, Universidad de Sevilla, España.

• Prof. Alexandra La Cruz de la Universidad Simón Bolívar.

• OpenGL Programming Guide.