Professional Documents
Culture Documents
Transformaciones geomtricas.
Parece que ya vamos empezando a meternos de lleno en el mundillo del 3D. Ya estamos
hablando en trminos bastante ms serios que al principio y en poco tiempo seremos capaces
de programar alguna que otra aplicacin 3D de calidad.
En este nmero os presento varias capturas de un ejemplo hecho a medida para Macedonia, o
sea para vosotros. Al final os dar tambin el cdigo para que podis compilarlo, ejecutarlo y
alterarlo a vuestro gusto.
Vamos pues con ms materia y.....ya que an no os haba visto, Feliz Ao Nuevo !
Coordenadas Homogneas
Todos estamos acostumbrados a utilizar coordenadas cartesianas para representar los vrtices
que definen a nuestra geometra. Es decir un punto es algo as:
P = ( x, y, z) y representa una determinada localizacin en un espacio 3D.
Pero cuando programamos Grficos hablamos de puntos y de vectores y pueden confundirse
en cuanto a representacin. Si entendemos que un vector es una resta entre dos puntos...
Vector v = Punto1 - Punto2 = (x1, y1, z1) - (x2, y2, z2) = (a, b, c)
y acaso (a, b, c) no parece tambin un punto ???
Por otra parte trabajaremos modelando geometra para luego transformarla....trasladndola a
otra posicin, rotndola respecto de un eje, escalndola para cambiar su tamao...Estas son
las llamadas transformaciones afines/rgidas/lineales. Dado que operamos usando matrices
para efectuar estas transformaciones necesitamos modificarlas ligeramente por dos motivos:
Para que no alteren de igual forma a un vector y a un punto, lo cual sera incorrecto.
Punto P1 = (x1, y1, z1) en cartesianas es P1 = (x1, y1, z1, w1) en homogneas.
Veris ms adelante en este captulo como este convenio nos permite operar transformando un
punto en otro punto y un vector en otro vector....y nada de cruces extraos entre uno y otro !!!
Pero y si W es diferente de lo que dices ... ?
En ese caso tendremos que efectuar una sencilla operacin para transformar un punto
homogneo en uno cartesiano. Si tenemos el punto...:
Punto P1 = (x1, y1, z1, w1) en homogneas...
...entonces en cartesianas el punto es P1 = (x1/w1, y1/w1, z1/w1)
Es decir que normalizamos cada una de las componentes XYZ del punto por su componente
W. Claro en el caso de W = 1 no hay que hacer nada pues la divisin es obvia pero puede
pasar que nos interese variar W y entonces no podremos usar las XYZ hasta haberlas
normalizado segn os acabo de explicar.
Segn lo que os acabo de decir deberais ver clarsimo que:
P = (1, 2, 3, 1) = (2, 4, 6, 2) = (5, 10, 15, 5).......estis de acuerdo conmigo ???
Escalar
Gracias a la funcin de escalado podemos aumentar/disminuir un objeto en cuanto a tamao.
Tan slo tendremos que multiplicar a cada uno de sus vrtices por la matriz que sigue,
unindolos despus con lneas tal y como estaban al inicio:
Trasladar
Esta es precisamente una transformacin afn imposible de realizar en cartesianas si no se
incluye una suma de matrices. Pero nosotros no queremos sumar, tan slo multiplicar. Y es que
la mayora de los "pipeline's" grficos implementados va hard en aceleradoras 3D o tarjetas de
video esperan recibir matrices para concatenarlas y multiplicarlas.
Si queris haced la prueba. Intentad aplicar la transformacin que veis en la figura sin usar
coordenadas homogneas, es decir con un vector y una matriz de 3 x 3, y ya veris como es
imposible hacerlo. Necesitareis sumar "algo" al resultado para lograrlo.
En cuanto a la figura:
Rotar
La rotacin debe realizarse siempre alrededor de un determinado eje de referencia. Podemos
rotar alrededor del eje X, del eje Y o del eje Z, y segn el caso la matriz a aplicar ser una o
ser otra. En el caso de la figura:
Deformar
Es la llamada transformacin de "Shearing". Consiste en hacer que alguna de las componentes
de un vrtice vare linealmente en funcin de otra. Me explico, se trata por ejemplo de alterar el
valor de la X y de la Y en funcin del de la Z. Se consiguen efectos de distorsin muy
interesantes para ciertas animaciones. Os dejo las matrices a aplicar:
Concatenacin de transformaciones
Premultiplicacin y postmultiplicacin
Ms convenciones !!!...si no nos podemos todos de acuerdo nos volveremos locos. Pero en
qu quieres que lleguemos un acuerdo ahora, Oscar?...no hay suficiente con el tema de los
ngulos de rotacin?...pues no !!!...Existe otra cosa muy importante por aclarar.
Existen dos convenciones en cuanto a uso de transformaciones geomtricas: la de Robtica /
Ingeniera y la de Grficos. En ambos casos se realizan exactamente las mismas operaciones
pues tanto puedo querer mover un brazo robot como un personaje sobre mi juego 3D. Pero en
cada caso se sigue una metodologa distinta.
En la convencin de Grficos, que es la que yo he estado asumiendo durante todo el artculo y
en concreto en la figura 9, se postmultiplican las matrices. Y eso qu eeeeeeehhhhhh?...pues
que los puntos se toman como vectores en columna que se multiplican a las matrices por la
derecha. Y adems el orden de las transformaciones, de primera a ltima a aplicar, es de
derecha a izquierda.
En cambio en Robtica se utilizan vectores de tipo fila, o rengln, que se multiplican por la
izquierda. Las matrices se ordenan de izquierda a derecha en cuanto a orden de las
transformaciones. Es decir, se premultiplica.
Aqu tenis grficamente lo que buenamente he intentado expresar escribiendo:
Implementacin
Bueno...y cmo usa OpenGL todo esto?, cmo le indico las transformaciones?, a qu
afectan stas?....
En cualquier aplicacin o paquete grfico, tambin en OpenGL por supuesto, toda la geometra
se ve afectada por la CTM (Current Transformation Matrix) o matriz de transformacin actual.
Esta guarda la informacin sobre todas las matrices que se han ido acumulando. Cualquier
vrtice que pase por el "pipeline" ser multiplicado por esta matriz y consecuentemente
transformado.
En OpenGL la CTM se compone de dos matrices. La "Model-View matrix" o matriz de
transformacin y la "Projection matrix" o matriz de proyeccin. Ambas se concatenan y de su
producto se crea la CTM para el "pipeline" que controla OpenGL. De la segunda ya
profundizaremos ms adelante pues se encarga de la conversin 3D (mundo virtual) a 2D
(pantalla) es decir de la proyeccin. La primera nos interesa mucho ahora pues almacena todas
las transformaciones afines que definamos en nuestro cdigo.
Lo primero que debe hacerse es inicializar la matriz. Esto se hace cargando en ella la matriz
identidad que como ya sabris es el elemento neutro de la multiplicacin de matrices. Con esto
me aseguro de "limpiarla" por completo antes de empezar a aadir transformaciones. Si no lo
hiciera correra el riesgo de aadir transformaciones a otras ya existentes con lo cul el
resultado en pantalla sera de todo menos el esperado. Esto lo hago con:
glMatrixMode(GL_MODELVIEW); /* Activo la matriz */
glLoadIdentity(); /* La limpio antes de nada !!! */
Una vez hecho esto puedo acumular transformaciones sucesivas mediante las funciones:
glScalef(GLfloat sx, GLfloat sy, GLfloat sz); /* Escalar segn sean
los factores sx, sy y sz*/
Y se acab !!!
El ejemplo del que os he mostrado capturas durante todo el artculo lo tenis aqu. No pretende
ser ptimo ni mucho menos. Podra mejorarse enormemente pero no pretendo eso. Lo que
quiero es que sea docente y claro pues son los conceptos los que tenis que entender para
poder hacer virguerias programando ms tarde. Espero que lo compilis y ejecutis y
sobretodo que entendis lo que hace. Modificadlo a vuestro gusto y probad tanto como os sea
posible.
Nos vemos en el siguiente nmero con ms material !!!...hasta ahora !!!