El problema de dibujar de la vieja manera es que un sprite o polígono siempre se encuentra en un plano-xy, esto es, todas las esquinas tienen la misma profundidad. Para 3D verdadero debes ser capaz de tener vértices a diferentes profundidades. A partir de este momento hablaremos de la coordenada-z en vez de la profundidad (depth). Así que debemos especificar coordenadas como (x,y,z). Para esto existe una versión especial de funciones de dibujado avanzado:
d3d_primitive_begin(tipo) Inicia una primitiva 3D de un tipo indicado: pr_pointlist, pr_linelist,pr_linestrip,pr_trianglelist,pr_trianglestrip o pr_trianglefan.
d3d_vertex(x,y,z) Añade el vértice (x,y,z) a la primitiva, usando color y valor alfa especificados con anterioridad.
d3d_vertex_color(x,y,z,col,alpha) Añade el vértice (x,y,z) a la primitiva, con su propio color y valor alpha. Esto te permite crear primitivas con un suave cambio de color y valores alfa.
d3d_primitive_end( ) Finaliza la descripción de la primitiva. Esta función realmente la dibuja.
Por ejemplo, para dibujar un tetraedro (pirámide de tres lados) situada en el plano z=0 con su punta en z = 200, puedes usar el siguiente código:
{
d3d_primitive_begin(pr_trianglelist);
d3d_vertex(100,100,0);
d3d_vertex(100,200,0);
d3d_vertex(150,150,200);
d3d_vertex(100,200,0);
d3d_vertex(200,200,0);
d3d_vertex(150,150,200);
d3d_vertex(200,200,0);
d3d_vertex(100,100,0);
d3d_vertex(150,150,200);
d3d_vertex(100,100,0);
d3d_vertex(100,200,0);
d3d_vertex(200,200,0);
d3d_primitive_end();
}
Ahora que si quieres usar esto, lo más posible es que sólo verás un triangulo en la pantalla porque la punta del tetraedro estaré en frente del punto de vista. Aparte, usando sólo un color, sería difícil de ver las diferentes caras. Adelante veremos maneras de cambiar el punto de vista. Asignando colores lo cual puede hacerse como antes añadiendo la función draw_set_color(col) entre las vértices.
También puedes usar polígonos texturizados en 3D. Funciona de la misma manera como está descrito en las funciones de dibujado avanzado en la documentación. Pero en esta ocasión necesitas variantes 3D de las funciones básicas. De una cosa te debes dar cuenta. En una textura la posición (0,0) es la esquina superior-izquierda. Pero en ocasiones, cuando se usan proyecciones (como se indica adelante), la esquina inferior-izquierda es (0,0). En ese caso necesitas girar la textura verticalmente.
d3d_primitive_begin_texture(tipo,texid) Inicia una primitiva 3D del tipo indicado con la textura indicada.
d3d_vertex_texture(x,y,z,xtex,ytex) Añade el vértice (x,y,z) a la primitiva con posición (xtext,ytext) en la textura, mezclando con el color y valor alpha especificados anteriormente.
d3d_vertex_texture_color(x,y,z,xtex,ytex,col,alpha) Añade el vértice (x,y,z) a la primitiva con posición (xtex,ytex) en la textura, mezclando con su propio color y valor alpha.
d3d_primitive_end() Finaliza la descripción de la primitiva. Esta función en realidad la dibuja.
Así que, por ejemplo puedes usar el siguiente código para dibujar una imagen de fondo que desaparece a la distancia
{
var ttt;
ttt = background_get_texture(back);
d3d_primitive_begin_texture(pr_trianglefan,ttt);
d3d_vertex_texture(0,480,0,0,0);
d3d_vertex_texture(640,480,0,1,0);
d3d_vertex_texture(640,480,1000,1,1);
d3d_vertex_texture(0,480,1000,0,1);
d3d_primitive_end();
}
Un triángulo tiene una cara frontal y una trasera. La cara frontal está definida para ser el lado donde los vértices son definidos en orden contrario al reloj. Normalmente ambos lados son dibujados. Pero si haces una forma cerrada esto es inútil porque el lado trasero del triángulo nunca puede ser visto. En este caso puedes encender backface culling. Esto salva cerca de la mitad la cantidad del tiempo dibujando pero te deja con la tarea de definir tus polígonos de la manera correcta. Existe la siguiente función:
d3d_set_culling(separar) Indica iniciar backface culling (true) o detener backface culling (false).