Cámara e Input
Para trabajar en tres dimensiones tenemos que tener en cuenta los espacios de nuestros objetos:
Local space
Se corresponden con las coordenadas originales o locales del objeto, se suelen dejar homogéneas para después manipularlas con facilidad.
World space
Corresponde al mundo donde se ubica los objetos, cada objeto tiene una posición, orientación y tamaño en este.
View space
Es el mundo que se esta viendo, por lo tanto, es solo una porción del mundo y esta vinculado a la cámara de la escena
Clip space
Es espacio hómogeneo de OpenGL, desde -1 a 1 en todas las coordenadas, lo que queda fuera se elimina o recorta

\[ M_{projection} \cdot M_{view} \cdot M_{model} \cdot v_{local} = v_{clipped} \]
Sirve para moverse desde el espacio local al espacio homogéneo de OpenGL
Para pasar de coordenadas locales a las de mundo usamos la matriz de modelo.
\[ M_{model} = M_{translation} \cdot M_{rotation} \cdot M_{scale} \]
Es la que usamos la clase pasada para mover los modelos!
Para pasar de coordenadas de mundo a las de vista o de cámara, usamos la matriz de vista. Con un poco de magia de álgebra lineal tenemos que:
\[ M_{view} = M_{lookat} = \begin{pmatrix} r_x & r_y & r_z & 0\\ u_x & u_y & u_z & 0\\ d_x & d_y & d_z & 0\\ 0 & 0 & 0 & 1\\ \end{pmatrix} \cdot \begin{pmatrix} 1 & 0 & 0 & -p_x\\ 0 & 1 & 0 & -p_y\\ 0 & 0 & 1 & -p_z\\ 0 & 0 & 0 & 1\\ \end{pmatrix} \]
Donde
Finalmente, para pasar de las coordenadas de vista a las homogéneas de OpenGL se usa la matriz de proyección, que viene en dos sabores:
Para manejar input podemos utilizar Pyglet la cual nos provee funciones que son llamadas durante el ciclo del juego, similar a on_draw:
on_key_press(symbol, modifiers): función que se llama cuando se presiona una tecla y se guarda el valor de la tecla en symbol.on_key_release(symbol, modifiers): función que se llama cuando se libera una tecla y se guarda el valor de la tecla en symbol.on_mouse_motion(x, y, dx, dy): función que se llama cuando el mouse se mueve y guarda la posición del mouse en la ventana (x e y), así como el cambio de este (dx y dy).Existen más que pueden ver en la documentación de la librería
El auxiliar pasado vieron realizar un montón de transformaciones para alterar los modelos, ahora veremos como abstraer el concepto de modelo en una clase.
Una clase es una forma que se tiene para empaquetar código, la idea es que cada clase represente algo.
Cree la clase GameModel, que contenga lo siguiente:
Use esta clase junto a sus nuevos conocimientos para recrear la siguiente escena:
Muy bonita su escena pero hay elementos que no se ven completamente, como usted conoce ahora la potente matriz MVP, le gustaría poder moverse en su escena.
Cree la clase Camara que contenga información de la posición de la cámara y su velocidad y use el teclado para moverse en la escena usando on_key_press y on_key_release
Añada los valores de pitch y yaw que permitan mover la cámara, use la función on_mouse_motion para vincular el ángulo de vista con el movimiento del mouse

Corrija el movimiento de la parte A para que este sincronizado con la dirección de la cámara

Felicidades! Ahora puedes hacer un 360 no scope 🤠
CC3501 — Modelación y Computación Gráfica para Ingenieros