Desarrollo de Videojuegos


Matemáticas Básicas
Álbegra Matricial. Modelado alámbrico de figuras 3D


Artículo realizado por
David Isla "Cid"





Capítulo 2.
Las matrices para trasladar, escalar y rotar.

El anterior capítulo explicábamos como ciertas matrices podían ser utilizadas para trasladar, escalar y rotar puntos tridimensionales. Pues bien, aquí tenéis las cinco matrices que hacen eso posible:

Matriz de Traslación


		1	0	0	0



		0	1	0	0

	

		0	0	1	0

		

		ValorX	ValorY	ValorZ	1



      

Matriz Escalar


		ValorX	0	0	0



		0	ValorY	0	0

	

		0	0	ValorZ	0

		

		0	0	0	1



      

Matriz de Rotación en el eje de la Z, siendo 'a' los radianes a rotar


		cos(a)	sin(a)	0	0



		-sin(a)	cos(a)	0	0

	

		0	0	1	0

		

		0	0	0	1



      

Matriz de Rotación en el eje de la X, siendo 'a' los radianes a rotar


		1	0	0	0



		0	cos(a)	sin(a)	0

	

		0	-sin(a)	cos(a)	0

		

		0	0	0	1



      

Matriz de Rotación en el eje de la Y, siendo 'a' los radianes a rotar


		cos(a)	0	-sin(a)	0



		0	1	0	0

	

		sin(a)	0	cos(a)	0

		

		0	0	0	1



      

Imaginemos que tenemos un punto tridimensional, por ejemplo (3,4,10). Éste punto, que se halla colocado en algún sitio del plano, lo queremos rotar en el eje de las X. Pues bien, para ello haremos lo siguiente:

Se construye un vector del tipo {x,y,z,1}, el la constante 1 al final de este vector es muy importante, la utilizamos para que 'las cuentas cuadren' al multiplicar este vector de coordenadas tridimensionales por la matriz que deseemos (que en este caso, recordemos, es la de rotar en el eje de las X). Si lo codificamos haremos lo siguiente:




         void MultiplicarVector( double Resultado[4],

                                 double Matriz1[4],

                                 double Matriz2[4][4] )

         {

            Resultado[0] = Matriz1[0]*Matriz2[0][0] +

                           Matriz1[1]*Matriz2[0][1] +

                           Matriz1[2]*Matriz2[0][2] +

                           Matriz1[3]*Matriz2[0][3];

            Resultado[1] = Matriz1[0]*Matriz2[1][0] +

                           Matriz1[1]*Matriz2[1][1] +

                           Matriz1[2]*Matriz2[1][2] +

                           Matriz1[3]*Matriz2[1][3];

            Resultado[2] = Matriz1[0]*Matriz2[2][0] +

                           Matriz1[1]*Matriz2[2][1] +

                           Matriz1[2]*Matriz2[2][2] +

                           Matriz1[3]*Matriz2[2][3];

            Resultado[3] = Matriz1[0]*Matriz2[3][0] +

                           Matriz1[1]*Matriz2[3][1] +

                           Matriz1[2]*Matriz2[3][2] +

                           Matriz1[3]*Matriz2[3][3];

         }



         main()

         {

	

            .....



            double nX = 3, nY = 4, nZ= 10, GradosX = 0.5;  // Coordenadas y grados (radianes)

            double Vector[4], Resultado[4];    // Vectores

            double MatrizX[4][4] = { 1,             0,            0,   0,

                                     0,  cos(GradosX), sin(GradosX),   0,

                                     0, -sin(GradosX), cos(GradosX),   0,

                                     0,             0,            0,   1  };



            Vector[0] = nX;

            Vector[1] = nY;

            Vector[2] = nZ;

            Vector[3] = 1;

            MultiplicarVector( Resultado, Vector, MatrizX );

            nX = Resultado[0];

            nY = Resultado[1];

            nZ = Resultado[2];



         }





      

La primera función multiplica el vector de 4 posiciones Matriz1 por una matriz de 4x4 Matriz2 dejando el resultado de la operación en Resultado. Éste, es otro vector de 4 posiciones que contendrá las nuevas posiciones X, Y, Z. Después de la operación, si observamos el código restante, en ella se definen un vector de 4 posiciones llamado Vector, otro vector de cuatro posiciones llamado Resultado (donde guardaremos la nueva posición del punto al finalizar la función MultiplicarVector) y la MatrizX, que contiene la anterior matriz de rotación del eje de las X.

Pues con este código, rotaríamos el punto (3,4,10) en el eje de las X. Claro que con un punto, no apreciaremos si ha existido o no, una rotación. En vez de esto podríamos construir líneas, con puntos de comienzo y de final para observar mejor el efecto de rotación en los tres ejes. Y esto mismo es lo que vamos hacer en el siguiente capitulo.



Puedes conseguir el código fuente del artículo pulsando aquí


ÚLTIMA REVISIÓN EN FEBRERO DE 1999




DESARROLLO DE VIDEOJUEGOS
a
MACEDONIA Magazine