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
|
|