Sistema de coordenadas

Imagino que todo el mundo sabra ya a estas alturas lo que es un sistema de coordenadas, no?
De todas formas conviene refrescar la memoria un poco y ver como interpretar los sistemas de coordenadas para usarlas en DirectX. Entender este y los siguientes capítulos sobre geometría es fundamental para trabajar con Direct3D !!

 

Es importante situar bien los ejes:

- el eje Y positivo va hacia arriba

- el eje X positivo va hacia la derecha

- el eje Z positivo se aleja de nosotros

Este sistema de coordenadas se llama "Left Hand". Otros sistemas como OpenGL utilizan el sistema opuesto (Right Hand)

 

Cuando queremos representar una figura cualquiera en el espacio 3D, es decir en nuestro sistema de coordenadas, debemos tener en cuenta como numeramos los vertices de nuestra figura.

Supongamos que queremos representar un simple cuadrado:

Este cuadrado tiene 4 vertices. Un vertice es el punto de interseccion entre varias lineas.

Lo importante es que definas siempre los vertices siguiendo el sentido de las agujas del reloj.

 

>OK, pero como hago para representar el cuadrado dentro del sistema de coordenadas?

Pos mu facil tio, basta con trasladar cada uno de los vertices a los ejes correspondientes, fijate en el dibujo:


 

Para definir un vertice en el espacio 3D necesitamos especificar sus 3 componentes de coordenada; x, y, z

El origen de coordenadas es 0,0,0.

La posición de los vertices del cuadrado anterior se describirian así:

v1( 0, 0, 0 )
v2( 0, 2, 0 )
v3( 0, 2, 2 )
v4( 0, 0, 2 )

 

 

Entonces, si te fijas un poco en el dibujo, podemos decir que cualquier vertice se puede especificar mediante un vector que vaya desde el origen de coordenadas al punto 3D en el espacio.

Los Vectores son una parte fundamental de la programacion con Direct3D. Los vectores describen una dirección y una magnitud. Los vectores se representan como v = ( 1, 2, 3) La primera columna son las unidades en el eje X, la sugunda en el eje Y, y la tercera en el eje Z.

en el dibujo de la izquierda, la flecha roja es un vector que representa el tercer vertice (v3) de nuestro cuadrado.

No solo se usan para definir la posicion de los vertices, tambien se usan para definir una direccion, por ejemplo el vector vArriba (0, 1, 0) define la direccion "hacia arriba".

Direct3D tiene dos estructuras para definir vectores: D3DVECTOR y D3DXVERTEX3

D3DVECTOR se encuentra definida en d3dtypes.h, y maneja las rutinas matematicas que necesitas para usar vectores.

D3DXVECTOR3 está definida en d3dx8math.h y es una versión mejorada de la anterior estructura.

Puedes usar cualqueira de las dos en tu programa, en nuestro ejemplo definiriamos el vertice 3 de la siguiente manera:

D3DVECTOR v3(0,2,2); // usando la estructura por defecto, o...

D3DXVECTOR3 v3(0,2,2); // usando la lbreria mejorada

 

 

Orientación

Cuando posicionamos un objeto en el espacio 3D, necesitamos especificar su orientación, esto se consigue usando tres vectores.

Estos vectores se usan para especificar:

- Hacia donde está MIRANDO objeto

- Dónde es ARRIBA para el objeto

- En que POSICION se encuentra

Para trabajar con estos vectores es necesario almacenarlos en una matriz, pero esto ya lo explicare mas adelante.

 

Caras y normales

Cuando queremos representar cualquier objeto 3D necesitamos recurrir a puntos, lineas y sobretodo TRIANGULOS. Porque triangulos?

muy snecillo, porque es la unidad minima para modelar cualquier objeto complejo, y porque las tarjetas de video actuales trabajan muy rapidamente haciendo calculos con triangulos.

Asi tenemos que cualquier cara de un objeto se va a dividir en triangulos.

Fijate en el dibujo de la derecha, un simple cubo de 6 caras esta compuesto por 12 triangulos.

Como ya dije antes, siempre que definas los vertices de cada triangulo recuerda seguir el sentido de las agujas del reloj, sino no se visualizara nada !!

Esto que acabi de decir se debe a que Direct3D solo dibuja las caras frontales de los objetos, que por defecto son aquellas caras que los vertices estan agrupados de acuerdo al sentido de las agujas del reloj. Este proceso se denomina "backface culling"

Probablemente hayas oido hablar alguna vez de las "normales", al menos si has dado dibujo en el cole deberias acordarte.

En Direct3D aplicamos las normales para conocer la direccion a la que apunta una cara, o dicho de otra manera, la parte visible de una cara.

Normal es el vector perpendicular a la cara.

Generalmente podemos definir normales en cada uno de los vertices de la cara. En el dibujo de la izquierda puedes ver las lineas rojas que representan las normales de esa cara.