Viendo el mundo

Por defecto tu vista es a través del eje-z negativo hacia el medio del cuarto. En ocasiones en juegos 3D deseas poder cambiar la manera en que miras al mundo. Por ejemplo, en un juego de disparos en primera persona probablemente deseas tener la cámara mirando desde una posición un poco sobre el plano-xy a lo largo del plano-xy. En términos gráficos estás estableciendo la proyección correcta. Para cambiar la manera en que miras, las siguientes funciones existen.

 

d3d_set_projection(xfrom,yfrom,zfrom,xto,yto,zto,xup,yup,zup) Defines como mirar en el mundo. Especificas el punto desde dónde mirar, el punto a mirar y el rumbo ascendente.

 

Esta función requiere alguna explicación. Para establecer la proyección primero necesitas la posición desde la cual miras. Esto está indicado por los parámetros (xfrom,yfrom,zfrom). En seguida debes especificar la dirección que miras. Esto se hace dando un segundo punto al cual mirar. Este es el punto (xto,yto,zto). Finalmente, incluso puedes rotar la cámara alrededor de la línea del punto de vista al punto observado. Para especificar esto debemos tener un rumbo ascendente, esto es, la dirección ascendente en la cámara. Esto es dado por los últimos tres parámetros (xup,yup,zup). Permítanme dar un ejemplo. Para mirar a través del plano-xy como en un primera persona puedes usar

 

{
  d3d_set_projection(100,100,10,200,100,10,0,0,1);
}

 

Así miras desde el punto (100,100) y 10 sobre el plano en dirección de (200,100). Los puntos del vector up es la dirección-z que requiere. Para hacer esto ligeramente más complicado, asumamos que tienes una instancia en tu cuarto que especifica la posición de la cámara. Esta tendrá una posición (x,y) actual y una dirección (y quizá incluso una velocidad). Ahora puedes especificar esto como tu cámara usando el siguiente código:

 

{
  with (obj_camera)
    d3d_set_projection(x,y,10,
               x+cos(direction*pi/180),y-sin(direction*pi/180),10,
               0,0,1);
}

 

Esto puede lucir algo complicado. Miramos desde la posición de la cámara (x,y), 10 sobre el piso. Para determinar un punto en la dirección correcta necesitamos hacer algo de aritmética. Este punto está indicado por los tres siguientes parámetros. Finalmente usamos el vector up como antes.

 

¡Una observación importante! Cuando Game Maker comienza a dibujar un cuarto este pondrá el punto de vista de regreso a la posición por defecto. Así que la primera cosa que necesitas hacer cuando dibuja la escena es poner la proyección que desees. ¡Esto debe hacerse en un evento Draw!

 

Existe también una versión extendida de la función anterior:

 

d3d_set_projection_ext(xfrom,yfrom,zfrom,xto,yto,zto,xup,yup,zup,angle,aspect,znear,zfar) Una versión extendida de esta función en la cual además especificas el ángulo definiendo el campo de vista, el radio de aspecto entre el tamaño vertical y horizontal de la vista, y los planos cercanos y lejanos de recorte.

 

Los parámetros adicionales trabajan como sigue. Si especificaste la posición de la cámara, el punto a mirar, y el vector up, puedes todavía cambiar qué tan unidos están los lentes de la cámara. Esto es conocido como el campo de vista. Un valor razonable es 45 grados y esto es el valor por defecto tomado. Pero puedes cambiar esto si gustas. Después puedes especificar la relación de aspecto entre la proyección horizontal y vertical. Normalmente quieres usar el mismo como la radio de aspecto del cuarto o la vista, p.ej. 640/480. Finalmente puedes indicar los planos de recorte. Los objetos que son más cercanos que znear a la cámara no son dibujados. Similar para objetos más lejos que zfar. Puede ser importante poner estos parámetros a valores razonables porque ellos también influyen en la precisión de las comparaciones de z. Si usted hace el rango demasiado grande la precisión empeora. Por defecto usamos 1 y 32000. ¡znear debe ser más grande que 0!

 

A veces necesitas temporalmente una proyección normal ortográfica como la usada cuando no hay 3D. Por ejemplo, cuando quieres dibujar alguna capa. Para esto puedes usar la función siguiente:

 

d3d_set_projection_ortho(x,y,w,h,ángulo) Pone una proyección normal ortográfica del área indicada en el cuarto, girando sobre el ángulo indicado.

 

Un uso estándar para esto es dibujar una capa para p.ej. mostrar el puntaje u otros aspectos. Para hacer esto ponemos una proyección ortográfica. También debemos desactivar hidden surface removal temporalmente porque queremos que la información sea dibujada independientemente del valor de profundidad actual. El ejemplo siguiente muestra como crear una capa con el puntaje.

 

{
  draw_set_color(c_black);
  d3d_set_projection_ortho(0,0,room_width,room_height,0);
  d3d_set_hidden(false);
  draw_text(10,10,'Score: ' + string(score));
  d3d_set_hidden(true);
}