cámara y cuaterniones en openglcs.uns.edu.ar/cg/practicos/camara_y_cuaterniones[handout].pdfsi a y...

19
amara y Cuaterniones en OpenGL Gazc´ on Nicol´ as Urribarri Dana Computaci´onGr´ afica Departamento de Ciencias e Ingenier´ ıa de la Computaci´ on Universidad Nacional del Sur Computaci´ on Gr´ afica, 2015 Gazc´onNicol´ as, Urribarri Dana (UNS) amara y Cuaterniones en OpenGL Computaci´onGr´ afica, 2015 1 / 24

Upload: others

Post on 07-May-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Cámara y Cuaterniones en OpenGLcs.uns.edu.ar/cg/practicos/Camara_y_Cuaterniones[handout].pdfSi a y b son cuaterniones unitarios que representan rotaciones, la rotaci on que representa

Camara y Cuaterniones en OpenGL

Gazcon Nicolas Urribarri Dana

Computacion GraficaDepartamento de Ciencias e Ingenierıa de la Computacion

Universidad Nacional del Sur

Computacion Grafica, 2015

Gazcon Nicolas, Urribarri Dana (UNS) Camara y Cuaterniones en OpenGL Computacion Grafica, 2015 1 / 24

Page 2: Cámara y Cuaterniones en OpenGLcs.uns.edu.ar/cg/practicos/Camara_y_Cuaterniones[handout].pdfSi a y b son cuaterniones unitarios que representan rotaciones, la rotaci on que representa

Resumen

1 Camara en OpenGLUbicar la camara en el mundoMover la camara en el mundo

2 CuaternionesDefinicionOperacionesCuaterniones en OpenTK

Gazcon Nicolas, Urribarri Dana (UNS) Camara y Cuaterniones en OpenGL Computacion Grafica, 2015 2 / 24

Page 3: Cámara y Cuaterniones en OpenGLcs.uns.edu.ar/cg/practicos/Camara_y_Cuaterniones[handout].pdfSi a y b son cuaterniones unitarios que representan rotaciones, la rotaci on que representa

Camara en OpenGL

Para obtener la camara que visualice nuestra escena debemos realizardos cosas:

Ubicar la camara en el mundoEspecificar el volumen de vision

Esto implica obtener dos matrices: vista y proyeccion

Por suerte OpenTK nos provee las operaciones para generar estasmatrices sin tener que hacer las cuentas :)

Gazcon Nicolas, Urribarri Dana (UNS) Camara y Cuaterniones en OpenGL Computacion Grafica, 2015 4 / 24

Page 4: Cámara y Cuaterniones en OpenGLcs.uns.edu.ar/cg/practicos/Camara_y_Cuaterniones[handout].pdfSi a y b son cuaterniones unitarios que representan rotaciones, la rotaci on que representa

Ubicar la Camara

Para obtener la matriz de vista OpenTK provee la operacion:Matrix4.LookAt(eye, at, up)

eye es un vec3 que representa en que punto del mundo esta ubicadala camara.

at es un vec3 que representa a que punto del mundo esta apuntandola camara.

up es un vec3 que representa un vector que orienta la camara haciaarriba.

Recuerden que todos estos datos estan en coordenadas del mundo.

Gazcon Nicolas, Urribarri Dana (UNS) Camara y Cuaterniones en OpenGL Computacion Grafica, 2015 5 / 24

Page 5: Cámara y Cuaterniones en OpenGLcs.uns.edu.ar/cg/practicos/Camara_y_Cuaterniones[handout].pdfSi a y b son cuaterniones unitarios que representan rotaciones, la rotaci on que representa

Volumen de Vista

Cuando tenemos que especificar el volumen de vista nos referimos a lamatriz de proyeccion.

OpenTK nos provee operaciones para utilizar proyeccion ortografica yperspectiva:

Gazcon Nicolas, Urribarri Dana (UNS) Camara y Cuaterniones en OpenGL Computacion Grafica, 2015 6 / 24

Page 6: Cámara y Cuaterniones en OpenGLcs.uns.edu.ar/cg/practicos/Camara_y_Cuaterniones[handout].pdfSi a y b son cuaterniones unitarios que representan rotaciones, la rotaci on que representa

Proyeccion Ortografica

Este volumen de vista es comodo para realizar modelado ya que comoventaja mantiene las proporciones relativas de lo representado(recuerden como modelamos en Blender).

Para obtener una matriz de proyeccion ortografica con OpenTK:Matrix4.CreateOrthographicOffCenter(xLeft, xRight, yBottom,yTop, zNear, zFar)

Tambien: Matrix4.CreateOrthographic(width, height, zNear, zFar)

Gazcon Nicolas, Urribarri Dana (UNS) Camara y Cuaterniones en OpenGL Computacion Grafica, 2015 7 / 24

Page 7: Cámara y Cuaterniones en OpenGLcs.uns.edu.ar/cg/practicos/Camara_y_Cuaterniones[handout].pdfSi a y b son cuaterniones unitarios que representan rotaciones, la rotaci on que representa

Proyeccion Perspectiva (1)

Este volumen de vista permite obtener la sensacion de distancia comolo percibimos en el mundo real.

Para obtener una matriz de proyeccion perspectiva con OpenTK:Matrix4.CreatePerspectiveOffCenter(xLeft, xRight, yBottom, yTop,zNear, zFar)

Gazcon Nicolas, Urribarri Dana (UNS) Camara y Cuaterniones en OpenGL Computacion Grafica, 2015 8 / 24

Page 8: Cámara y Cuaterniones en OpenGLcs.uns.edu.ar/cg/practicos/Camara_y_Cuaterniones[handout].pdfSi a y b son cuaterniones unitarios que representan rotaciones, la rotaci on que representa

Proyeccion Perspectiva (1)

En algunos casos es de utilidad poder especificar la proyeccion deperspectiva en base al angulo de apertura de una camara.

Para obtener una matriz de proyeccion perspectiva con OpenTK deesta manera:Matrix4.CreatePerspectiveFieldOfView(fovy, aspect, zNear, zFar)

fovy es el angulo de vision vertical.

aspect es la relacion width/height de la imagen.

Gazcon Nicolas, Urribarri Dana (UNS) Camara y Cuaterniones en OpenGL Computacion Grafica, 2015 9 / 24

Page 9: Cámara y Cuaterniones en OpenGLcs.uns.edu.ar/cg/practicos/Camara_y_Cuaterniones[handout].pdfSi a y b son cuaterniones unitarios que representan rotaciones, la rotaci on que representa

Mover la Camara (1)

Ya sabemos como ubicar la camara en el mundo, sin embargo comose imaginaran, en muchos casos no sera suficiente con una camaraestatica.

Deberıamos poder mover la camara por la escena: ¿Como realizamosesto?

Podemos actualizar la matriz de vista: cambiamos el eye y/o el at delmetodo Matrix4.LookAt(eye, at, up)

Gazcon Nicolas, Urribarri Dana (UNS) Camara y Cuaterniones en OpenGL Computacion Grafica, 2015 11 / 24

Page 10: Cámara y Cuaterniones en OpenGLcs.uns.edu.ar/cg/practicos/Camara_y_Cuaterniones[handout].pdfSi a y b son cuaterniones unitarios que representan rotaciones, la rotaci on que representa

Mover la Camara (2)

¿Y si queremos movernos alrededor de algun punto?

Podemos usar coordenadas esfericas, aca ya no nos salvamos de hacercuentas :(

P(x , y , z)x = ρ cos θ sinϕy = ρ sin θ sinϕz = ρ cosϕ

De todas formas esto ya esta implementado en la clase camara :)(recuerden que en OpenGL los ejes no son los casicos cartesianos: zpositivo es hacia fuera de la pantalla...)

Gazcon Nicolas, Urribarri Dana (UNS) Camara y Cuaterniones en OpenGL Computacion Grafica, 2015 12 / 24

Page 11: Cámara y Cuaterniones en OpenGLcs.uns.edu.ar/cg/practicos/Camara_y_Cuaterniones[handout].pdfSi a y b son cuaterniones unitarios que representan rotaciones, la rotaci on que representa

Mover la Camara (3)

¿Podemos utilizar transformaciones para mover la camara?

Por supuesto! Podemos aplicar transformaciones para trasladar y rotarla camara.

¿Y con esto soluciono todo verdad?

Lamentablemente no, hay operaciones que se complican en el espacioeuclıdeo (rotaciones sobre ejes arbitrarios o interpolar el recorrido dela camara entre dos puntos) ademas de otras limitaciones (GimbalLock).

Para solucionar estos inconvenientes existen otros “artilugios”matematicos que vamos a ver a continuacion.

Gazcon Nicolas, Urribarri Dana (UNS) Camara y Cuaterniones en OpenGL Computacion Grafica, 2015 13 / 24

Page 12: Cámara y Cuaterniones en OpenGLcs.uns.edu.ar/cg/practicos/Camara_y_Cuaterniones[handout].pdfSi a y b son cuaterniones unitarios que representan rotaciones, la rotaci on que representa

Cuaternion

Un cuaternion se define como

a = w + x i + y j + zk w , x , y , z ∈ R

dondei2 = j2 = k2 = ijk = −1

Un cuaternion se puede notar, ademas, como

un real y un vector: a = 〈w ,p〉, p = (x , y , z)

cuatro reales: a = (w , x , y , z)

Gazcon Nicolas, Urribarri Dana (UNS) Camara y Cuaterniones en OpenGL Computacion Grafica, 2015 15 / 24

Page 13: Cámara y Cuaterniones en OpenGLcs.uns.edu.ar/cg/practicos/Camara_y_Cuaterniones[handout].pdfSi a y b son cuaterniones unitarios que representan rotaciones, la rotaci on que representa

Magnitud y normalizacion

La magnitud (norma o valor absoluto) de un cuaterniona = (w , x , y , z) = 〈w ,p〉 se define como

|a| =√

w2 + x2 + y2 + z2 =√w2 + p · p

Un cuaternion es unitario (normalizado) si |a| = 1.Un cuaternion a se normaliza calculando

a

|a|= (

w

|a|,x

|a|,y

|a|,z

|a|)

Gazcon Nicolas, Urribarri Dana (UNS) Camara y Cuaterniones en OpenGL Computacion Grafica, 2015 16 / 24

Page 14: Cámara y Cuaterniones en OpenGLcs.uns.edu.ar/cg/practicos/Camara_y_Cuaterniones[handout].pdfSi a y b son cuaterniones unitarios que representan rotaciones, la rotaci on que representa

Multiplicacion

Si a y b son dos cuaterniones tales que

a = 〈p,p〉 b = 〈q,q〉

El producto de a por b se define como

ab = 〈pq − q · p, qp + pq + q× p〉

Si |a| = |b| = 1, es decir, a y b son cuaterniones unitarios, entonces

|ab| = 1.

El producto de cuaterniones es asociativo ((ab)c = a(bc)) pero no esconmutativo (ab 6= ba).

Gazcon Nicolas, Urribarri Dana (UNS) Camara y Cuaterniones en OpenGL Computacion Grafica, 2015 18 / 24

Page 15: Cámara y Cuaterniones en OpenGLcs.uns.edu.ar/cg/practicos/Camara_y_Cuaterniones[handout].pdfSi a y b son cuaterniones unitarios que representan rotaciones, la rotaci on que representa

Rotacion

El cuaternion que representa una rotacion de un angulo θ alrededor de ladireccion v es

a = 〈cos(θ

2), sin(

θ

2)u〉

donde u =v

|v|= (ux , uy , uz) es un vector unitario en la direccion de v.

Luego

a = (w , x , y , z) = (cos(θ

2), sin(

θ

2)ux , sin(

θ

2)uy , sin(

θ

2)uz)

Gazcon Nicolas, Urribarri Dana (UNS) Camara y Cuaterniones en OpenGL Computacion Grafica, 2015 19 / 24

Page 16: Cámara y Cuaterniones en OpenGLcs.uns.edu.ar/cg/practicos/Camara_y_Cuaterniones[handout].pdfSi a y b son cuaterniones unitarios que representan rotaciones, la rotaci on que representa

Rotacion

En el cuaternion unitario

a = 〈cos(θ

2), sin(

θ

2)u〉

θ es el angulo de rotacion.

u es el eje de rotacion en formade un vector unitario.

El centro de rotacion es siempre elorigen.

Gazcon Nicolas, Urribarri Dana (UNS) Camara y Cuaterniones en OpenGL Computacion Grafica, 2015 20 / 24

Page 17: Cámara y Cuaterniones en OpenGLcs.uns.edu.ar/cg/practicos/Camara_y_Cuaterniones[handout].pdfSi a y b son cuaterniones unitarios que representan rotaciones, la rotaci on que representa

Rotacion

Concatenacion de rotaciones:

Si a y b son cuaterniones unitarios que representan rotaciones, larotacion que representa a seguido de b es equivalente a una unicarotacion determinada por el cuaternion ba.

La no rotacion equivale al cuaternion identidad a = (1, 0, 0, 0).

Para rotar un objeto se puede:

operar directamente con los cuaterniones en el shader de vertices. En

GLSL no hay un tipo Quaternion, por lo tanto habrıa que usar un vec4 e

implementar en el shader todas las funciones necesarias para operar. Para

esto faltarıan varias definiciones matematicas.

Convertir el cuaternion a una matriz y operar normalmente.

Gazcon Nicolas, Urribarri Dana (UNS) Camara y Cuaterniones en OpenGL Computacion Grafica, 2015 21 / 24

Page 18: Cámara y Cuaterniones en OpenGLcs.uns.edu.ar/cg/practicos/Camara_y_Cuaterniones[handout].pdfSi a y b son cuaterniones unitarios que representan rotaciones, la rotaci on que representa

Cuaterniones en OpenTK

Clase Quaternion:

Quaternion (Vector3 v, float w)

Quaternion (float x, float y, float z, float w)

Sirven para crear un cuaternion cualquiera.

static Quaternion FromAxisAngle (Vector3 axis, float

angle)

Crea un cuaternion de rotacion (por lo tanto unitario) de angle

radianes alrededor del eje axis.

Identity = new Quaternion(0, 0, 0, 1)

Define el cuaternion identidad.

Clase Matrix4:

static Matrix4 CreateFromQuaternion (Quaternion q)

A partir de un cuaternion unitario crea una matriz de rotacionequivalente.

Gazcon Nicolas, Urribarri Dana (UNS) Camara y Cuaterniones en OpenGL Computacion Grafica, 2015 23 / 24

Page 19: Cámara y Cuaterniones en OpenGLcs.uns.edu.ar/cg/practicos/Camara_y_Cuaterniones[handout].pdfSi a y b son cuaterniones unitarios que representan rotaciones, la rotaci on que representa

Camara con cuaterniones

Crear un vector eye que indique la posicion de la camara (ej: 0, 0,radius)

Crear un cuaternion CameraRot inicializado con el cuaternionidentidad.

Por cada cambio de orientacion:

Crear un nuevo cuaternion unitario Q con el eje que corresponda (1,0,0o 0,1,0) y el incremento del angulo usado (∆θ o ∆ϕ)CameraRot ← Q * CameraRot

La matriz de vista que devuelva la Camara sera:

la matriz equivalente a CameraRot * la traslacion en -eye

Gazcon Nicolas, Urribarri Dana (UNS) Camara y Cuaterniones en OpenGL Computacion Grafica, 2015 24 / 24