Guia para principiantes: el mundo 3D: deferencias entre juegos 2D y 3D.
Aprenda las diferencias entre juegos 2D y 3D en XNA Game Studio:
Si usted ha tomado el primer tutorial (Construir un juego en 2D) usted se ha venido acostumbrando a pensar en espacios 2D. Posición. Orientación, y movimiento, pueden ser representados en objetos de tipo Vector2 y un simple ángulo de rotación.
Este tutorial introduce el concepto de una tercera dimensión, y con él, un mundo de objetos nuevos. Fundamentalmente, el mundo 3D difiere del de 2D por la inclusión de una tercera coordenada (el eje Z o coordenada de profundidad. En XNA Game Studio, el mundo en 2D es de hecho una versión especial y restringida del mundo en 3D) así también, los mismos cálculos que se realicen aquí también toman lugar en el mundo 2D.
En XNA Game Studio, el reto 3D significa que en lugar de dibujar objetos estáticos de tipo Texture2D en un mundo bidimensional, usted dibujará modelos en 3D (representados en objetos de tipo Model). Estos son colisiones de puntos tridimensionales conectados llamados mallas, en un mundo completo, donde al final la renderización de estos objetos a la pantalla dependen de la posición y orientación de los objetos, y en la posición y orientación de los objetos y en la posición y orientación de la cámara a través de la cual la escena entera es renderizada.

Mucho mas puede hacerse con un punto en 3D, como sea, usando estructuras matemáticas que son llamadas matrices. Estas estructuras que están representadas por el la clase del framework de XNA Matrix, describen un rango de transformaciones que pueden ser aplicadas a un punto, grupo de puntos, o a un vector. Usando matrices, objetos en 3D pueden ser movidos, rotados y escalados y (a través del uso de matrices especiales llamadas matrices de vista o matrices de proyección) dibujarda sobre una imagen 2D puede ser mostrada en la pantalla.
Considere un grupo de puntos en el mundo 3D que queremos dibujar en pantalla. Los puntos tienen su propia información de posición y orientación relativa a algún punto central, llamado el origen. Sin ninguna transformación, estos puntos meramente existen en su propio espacio, llamado objeto espacial.
Cuando usted carga este grupo de puntos y los añade en su mundo a 3D, a usted le gustaría darle una posición en ese mundo en 3D, para rotar, y/o escalarlos. El producto de estas operaciones es llamado matriz de transformación del mundo. Después la matriz es aplicada a los puntos 3D, los puntos están considerados a estar en el mundo espacial.
Para renderizar estos puntos a la pantalla del usuario, se necesita mas información adicional. No es posible trasladar enteramente una escena de 3D a 2D, sin información acerca de la posición y el ángulo de la cual la escena esta capturada. Es necesario usar un viewport, también conocido como cámara, la cual observa al mundo en 3D y dibuja solo lo que esta ve. Es preparación para esta captura, la información de la cámara es computada dentro de una matriz de vista.
Finalmente, la información acerca de como dibujar una escena en 3D en 2D se necesita. Información (como la perspectiva y campo de vista) controla como los puntos en 3D son dibujados en la pantalla en 2D. Esta información es almacenada en una matriz de proyección, y cuando es aplicada, trae los puntos de el sistema de coordenadas en 3D en un sistema 2D llamado espacio de pantalla, cuando están llamados a ser dibujados como pixeles.
Si usted aplica este concepto de colisiones de puntos en 3D que esconden una malla. (que puede ser cualquier cosa de la representación de una nave en 3D, a un humano, a un dinosaurio) usted tiene los objetos fundamentales que usa en XNA Framework para hacer su juego en 3D (mallas, matrices y vectores).
Guía para principiantes: creando un método para dibujar un modelo.
Dibujar un modelo 3D en la pantalla es una acción compleja. Esto involucra la renderización de un largo número de polígonos, que son a menudo texturizados de diferentes maneras. Algunos pueden ser basados en artes, y algunos pueden ser programáticos. Dibujar es también una acción esencial. Cada objeto 3D que esta va a ser visualmente representado en un juego pasa a través de una secuencia de dibujado.
No es de sorprender que no haya una manera fija de estructurar un método para dibujar modelos. Los parámetros, limites, y algoritmos de dibujo para cada juego difieren, dependiendo de las necesidades y técnicas deseadas en el juego. Dada esta situación, XNA Framework no intenta promover un único método para dibujar modelos 3D. Esta herramienta a cambio provee los elementos y deja el reto de combinarlos al programador.
Un Model es el objeto fundamental en XNA Framework que representa un modelo a 3D, pero es mas complicado de lo que a primera vista parece. Un modelo esta compuesto de uno o mas objetos ModelMesh (MallaModelo) que existen en una colección. Cada objeto ModelMesh es una colección de vértices que maquillan una malla, la cual puede ser movida independientemente a otro objeto de tipo ModelMesh en el mismo Modelo.
ModelMesh, la torreta ModelMesh
La función del ModelMesh contiene el método Draw (Dibujar). Usted llama a este método una vez por cada ModelMesh que se dibujará en pantalla. Sin haber hecho las configuraciónes apropiadas de transformación e iluminación primero, de todas maneras usted no verá nada.
Transformaciones (las cuales determinan en donde el ModelMesh está orientado en el mundo, y últimamente en donde, donde va a aparecer y si va a aparecer en pantalla (e iluminación) que determina como las texturas asociadas con el ModelMesh van a ser mostradas) no son aplicadas a los niveles de una ModelMesh. Mas bien, cada ModelMesh tiene un numero de efectos que están asociados con eso. Un Effect (Efecto) puede ser pensado como instrucciones para el dispositivo gráfico sobre como configurar a un ModelMesh para dibujar.
En muchos juegos, los efectos son hechos a partir de complicadas series de pixel y vertex shaders. Esto es posible en XNA Game Studio, y eso es necesario para efectos gráficos avanzados. Pero por renderización simple, la tubería de contenido de XNA Framework, provee un fácil mecanismo de iluminación básica y dibujado (BasicEffect).
Cada ModelMesh que es cargado a través de la tubería de contenido recibe uno o mas objetos de tipo BasicEffect, los cuales pueden ser usados para ajustar transformaciones simples e iluminación sin implementar pixel ni vertex shaders. Todo lo que requieren los BasicEffect es un conjunto de objetos de tipo Matrix (Matrices) que corresponden al mundo, vista, y proyección de matrices para el ModelMesh y algunos parámetros de iluminación. Los parámetros por defecto pueden establecerse llamando al método BasicEffect.EnableDefaultLighting().
Después de que los parámetros de BasicEffect están configurados, lo que resta es llamar al método ModelMesh.Draw, para dibujar el ModelMesh en pantalla usando los parámetros que pasaron a Basic Effect.
Para un ejemplo de este paso mire un ejemplo del link de este paso trabajando sobre código.
Capitulo 5 - Paso 4:
Guía para principiantes: construyendo el mundo de la transformación:
Entender como posicionar, rotar y escalar modelos 3D con un transformador mundial.
Los modelos 3D son creados usando software de modelado en 3D. En esos paquetes de software, el artista crea el modelo en un mundo 3D. El mundo tiene un centro llamado origen, y el modelo es construido en elación a ese centro. La posición, rotación, y escala son relativos en relación a ese origen. Y cuando el juego carga un modelo, este conserva la posición, rotación y escala relativas. Se puede decir que modelo es un objeto del espacio o un modelo del espacio.
Cuando un juego dibuja un modelo, este alinea el origen del modelo del espacio con el origen del mundo del juego. Si el centro del modelo esta exactamente en el origen del espacio del modelo cuando fue salvado en el software de modelado, entonces este se mostrará en el origen del mundo cuando se dibujara en el juego.
Cuando se dibuja un modelo a 3D en su juego, necesitará aplicar 3 transformaciones a su modelo 3D. La primera de las 3, la transformación mundial, identifica como transformar su modelo de su posición inicial, orientación y escala (llamado objeto del espacio), en una posición, orientación, y escala en algún lugar en el mundo del juego.
Una transformación mundial estándar está echa de 3 matrices de transformación separadas (rotación, escala y translación), todas combinadas en una matriz de transformación mundial.
- La rotación cambia el ángulo de orientación del modelo (usted puede pensar de esto como rotar el modelo al rededor del espacio a un punto en diferente dirección). Aquí hay muchas maneras para calcular y almacenar valores de rotación, una de las mas populares son los ángulos de Euler, que rotan un objeto al rededor de 3 ejes en el mundo a 3D: X,Y, y Z. (La próxima sección explica y demuestra los ángulos de Euler). Para crear una matriz de rotación, usted puede usar el método Matrix.CreateFromYawPitchRoll, que pasa en el ángulo de rotación al rededor de cada eje. Para almacenar estos ángulos a sus objetos del juego, un objeto de tipo Vector3 es una buena elección.
- La escala cambia el tamaño de un modelo, haciéndolo ya sea mas grande o mas pequeño. Mientras sea posible hacer que el modelo recorra un tramo a lo largo de un eje hacia otro, es mas común aplicar una escala uniforme, que hace que el modelo entero se encoja o se agrande. para crear una matriz de escala use el método Matrix.CreateScale, pasando el factor con el cual desea encojer o agrandar el modelo. Usted puede almacenar el factor de escala para sus objetos de juego usando un simple flotante.
- La translación mueve el modelo entero a lo largo de 3 ejes del mundo 3D. Piense que la rotación como un deslizamiento del modelo al rededor de: lado a lado (X), arriba y abajo (Y), y adelante y atrás (Z). Para crear una matriz de translación use el método Matrix.CreateTraslation, pasando las cantidades a las cuales desea mover el modelo a lo largo de cada uno de los ejes. Para almacenar lo valores de translación para su objeto del juego, use un Vector3.
Una vez haya creado estas matrices, usted debe combinarlas en una simple matriz de transformación mundial. Este proceso es llamado concatenación. Para concatenar una matriz con otra en XNA Game Studio, use el operador de multiplicación (*). Usted debe concatenar las matrices en el orden correcto:
Transformación mundial = Rotación * Escala * Translación
El orden de concatenación es importante. Desde que la multiplicación de matrices no es conmutativa, multiplicar en el orden incorrecto mostrara resultados no deseados, accidentalmente trasladar antes que rotar, por ejemplo, rotar la translación del modelo al rededor el origen del mundo, dejando el modelo muy lejos, en algún lugar en el mundo espacial, en lugar de simplemente la rotación del modelo.
Cambiando estos valores de entrada en sus matrices de transformación individualmente, Usted puede animar un objeto moviéndolo a través del mundo (translación), un objeto rotando en el espacio (rotación), un objeto encogiendose o agrandándose lentamente (escala), o una combinacion de los 3.
Guia para principiantes; rotaciones en el espacio 3D: Rotaciones de Euler.
Entender los ángulos de Euler, una manera de rotar objetos 3D en XNA Game Studio.
Una parte escencial de cualquier transformación mundial es la rotación. La rotación corresponde a la orientación angular de cualquier objeto, comparado con un grupo particular de ejes.
Al final, la rotación de un objeto es creada usando una matriz que es concatenada con las matrices translación y escala para formar finalmente la matriz de transformación mundial. Como sea, aquí hay mas de una manera de describir la rotación cuando nosotros construimos la matriz de rotación .
El método que nosotros usamos en este tutorial involucra un grupo de rotaciones intermedias llamadas rotaciones de Euler. Piense en las rotaciones de Euler como una serie de 3 diferentes ángulos radianes, de 0 a 2π, cada uno al rededor de 3 ejes diferentes. Los ejes (X,Y y Z), pueden ser considerados como los ejes de rotación de inclinación, derrape y rodamiento:
El eje de rodamiento, que está definido a lo largo del eje X, puede ser pensado como la orientación de la nariz de una aeronave hacia arriba o hacia abajo. El eje de derrape, definido a lo largo del eje Y, rota de lado a lado la aeronave. El eje de rodamiento, a lo largo del eje Z, puede ser pensado como la aeronave rodando hacia la izquierda o derecha.
Para usar las rotaciones de Euler en el Framework de XNA para construir el componente de rotación de una matriz de transformación mundial, use el método Matrix.CreateFromYawPitchRoll, pasando de manera apropiada los valores de los ángulos de rotación. Esto forma una matriz de rotación simple que usted puede concatenar con las matrices de translación, rotación y escala, para formar la matriz mundial de transformación final.
Capitulo 7 - Paso 3:
Guia para principiantes: estados de entrada anteriores y por qué son útiles.
Aprender por qué es bueno mantener estados de entrada anteriores.
Para aprender la importancia de como aplica la entrada a los juegos, es necesario retomar pasos atrás y mirar los componentes de entrada de forma mas general. Las señales de los componentes de entrada de un controlador son simples cargas eléctricas que son interpretadas por un software de bajo nivel, llamado un conductor. Las señales son pasadas al software que las interpreta en un intervalo de tiempo.
Algunos software realizan interpretación de la entrada, extrayendo movimientos que un jugador realiza utilizando el componente de entrada, y almacenando esos movimientos en una memoria reguladora para ser leídos o para descartarlos. Este tipo de manejo de entrada se llama entrada en modo-regulado.
Otro tipo de manejo de entrada no utiliza un regulador. A cambio, provee el estado del controlador cuando este es preguntado. No hay parámetros para dar al sistema de entrada para discernir movimientos específicos con el tiempo. A cambio el programador es libre de simplemente preguntar en todo momento por el estado actual del controlador, incluyendo las posiciones de todos los ejes y botones. El programador es libre de almacenar y actuar sobre alguna información relevante. Este tipo de control de entrada se llama entrada en modo-intermedio.
El framework usa entrada en modo-intermedio. Para los tres tipos de entrada soportadas (El controlador de XBOX 360, el teclado y el ratón. Esto significa que para cualquier tipo de componente de entrada, usted puede preguntar el estado su estado actual en cualquier intervalo de tiempo. Usted no puede, de cualquier modo, preguntar por un estado anterior del controlador amenos que lo tenga almacenado explícitamente en algún lugar.
¿Por que desearía preguntar por estados previos de entrada?. Tomemos un ejemplo de un juego que requiere gran habilidad de un jugador y necesita presionar el botón rápidamente. En dicho juego, mantener presionado el botón no generaría un resultado, pero presionándolo repetidamente lo haría.
Debido a la naturaleza del tipo de manejo de entrada en modo-intermedio, cada vez que el estado de la entrada es preguntado, un botón presionado aparecerá como Pressed. Sin chequear un estado anterior para ver si el estado previo fue Released (liberado), no existe manera de explicar la diferencia entre un botón que acababa de ser presionado y uno que se mantiene presionado.
Mantener estados previos deshace ese problema. Para cada ciclo de actualización Update, procese una entrada como si fuera normal pero al final del ciclo, guarde el estado actual del controlador en una variable. Esta variable se convertirá en un estado anterior. Para chequear botones presionados anteriormente mas que los que se mantienen presionados actualmente, chequee el estado actual del botón si este esta Pressed (presionado), y el estado anterior del botón si esta Released (liberado).
Capitulo 8 - Paso 1:
Guia para principiantes: ¿Que es XACT?.
Aprenda acerca de la herramienta multiplataforma de creación de audio de Microsoft (XACT).
Esta sección del tutorial lo introduce a un nuevo programa incluido en XNA Game Studio (la herramienta multiplataforma de creación de audio de Microsoft ó XACT).
Conforme a su nombre, XACT es una herramienta multiplataforma que produce salida de audio para ser utilizado en Windows o en Xbox 360. El diseño de XACT contiene audio para ser diseñado independientemente de la plataforma a ser usada.
XACT esta compuesto de 2 partes principales: un diseñador de audio (La herramienta grafica que usted usa al principio de esta sección) y un audio API (el codigo que usted llama al final de esta sesion). El diseñador de audio esta pensado para ser accesible a cualquiera que quiera diseñar audio para su juego, aun si no está famirializado con el codigo para audio.
El diseñador de audio establece todos los archivos de audio de forma de onda prima (archivos de extención .wav llamados ondas) para usar. El diseñador entonces organiza las ondas en sonidos, en donde puede reproducir una o mas ondas en varios tiempos y conflagraciones. Finalmente, el diseñador de audio organiza los sonidos en señales. Las señales representan los objetos que son accedidos en codigo, y son mas como eventos de juego que archivos de audio actuales.
Las señales son expuestas al programador de audio, quien entonces llama las señales cuando los eventos apropiados del juego suceden, usando XACT API. El diseñador de audio puede tambien diseñar parametros en tiempo de ejecución para modificar el volumen o el tono de reproduccion de los sonidos, y pasar estos parametros al programador, quien modificara los parametros utilizando variables en el codigo del juego.
Mientras esto pueda verse complicado al principio, el beneficio puede notarse cuando el diseñador del juego quiera reemplazar los archivos de audio "forma de onda", ajustar como reproducir los sonidos, modificar como una señal reproduce un sonido, o cambia como los parametros modifican los sonidos ejecutados. El diseñador de audio puede hacer todas estas cosas sin cambiar el codigo fuente del juego.
XACT es una herramienta rapida y flexible para añadir audio robusto y enriquecido a los juegos que usted crea usando XNA Game Studio.
Guia para principiantes: objetos xact en diseño de tiempo y tiempo de ejecución.
Aprenda acerca de la ruta que toman los objetos de audio a travez de XNA Game Studio para llegar al jugador.
Los proyectos XACT tienen muchas partes para ellos. Aunque algunas partes de un proyecto XACT son opcionales, un grupo basico de objetos de XACT son requeridos para un proyecto XACT para exponer audio al XACT API.
Cada proyecto XACT contiene uno o mas bancos de sonido. Una banco de sonido es una colección de sonidos. Sonidos son instrucciones para reproducir una o mas ondas con varios para parámetros como ciclos, efectos de transición, elección al azar de ondas, y así sucesivamente.
Un banco de sonidos también contiene señales. Las señales son instrucciones para reproducir sonidos. Una señal llama a un sonido particular, o a una selección al azar de sonidos, dependiendo de como la señal está configuráda por el diseñador de audio.
Cuando un proyecto XACT es construido, los bancos de sonido son compilados en archivos, junto a un archivo de configuraciónes globales que contiene información especifica acerca del proyecto. Estos archivos son cargadosen tiempo de ejecución, usando llamados en el Framework de XNA.
Despues de los bancos de sonido, los bancos de sonido, y un archivo de configuraciones globales son cargados en el juego, el programador puede reproducir cualquier señal en el banco de sonidos llamando a SoundBank.PlayCue y pasando el nombre de la señal definida por el diseñador de sonido. Este ejecuta la señal como ha sido diseñado por el diseñador de audio, sin control heredado por el programador.
Para mas control granular de una señal, incluyendo la habilidad de pausarlo, volverlo a reproducir, y detener ka señal, el programador puede llamar al atributo SoundBank.GetCue() y recuperar un objeto de tipo señal. El programador puede entonces llamar a Cue.Play, Cue. Stop, Cue.Pause, y Cue.Resume cuando sea necesario. Como sea, sea cuidadoso si utiliza objetos de tipo Cue de esta manera. Si usted crea un objeto de tipo Cue adentro de un enunciado que tiene alcance limitado (por instaciar en un metodo) y no almacenarlo en memoria de espacio permanente como un array o lista proporcionada por una clase, la señal es detenida y descartada después de que el programa sale del ámbito de tiempo de aplicación del enunciado de alcance limitado.
Después de que una señal es reproducida, el motor de audio XACT se hace cargo. Este determina la relación entre la señal y su sonido asociado, y entre los sonidos y sus ondas asociadas, y reproduce los sonidos apropiados como los diseñados por el diseñador de sonido.
Capitulo 8 - Paso 5:
Guía para principiantes: cargando un proyecto XACT.
Aprenda acerca de cargar un proyecto de audio en XNA Game Studio.
Reproducir audio en XNA Game Studio requiere cargar un proyecto XACT en la tubería de contenido del Framework de XNA, escribiendo el código necesario para cargar los archivos de salida XACT en tiempo de ejecución, y entonces construir el proyecto XACT en archivos de salida XACT como parte del proceso de construcción.
El contenido del audio es diferente de muchos otros tipos de contenido en XNA Game Studio. Nada parecidos a los modelos, texturas, o fuentes, el contenido de audio que es generado por XACT no es cargado en tiempo de ejecución usando el metodo ContentManager.Load().
A cambo los constructores de la clases AudioEngine, SoundBank, y WaveBank en el Framework de XNA son usadas para cargar los archivos de audio construidos. Es importante cargar estos archivos en el orden correcto, e identificarlos por la extencion de su nombre. de otro modo, podría encontrarse con un error.
Para entender como cargar estos archivos, es importante entender cuales de estos archivos son generados cuando el proyecto XACT esta construido.
El primer archivo que es generado por XACT es el achivo de proyecto XACT (.xap). Este archivo es creado por la herramienta de diseño de sonido cuando el diseñador de audio guarda su proyecto. el archivo es entonces hubicado en el explorador de soluciones, la cual lo añade a la lista de archivos que la tuberia de contenido del Framework de XNA construye.
Despues de que empieza la construcción, la tuberia de contenido construye el archivo del proyecto de XACT en un grupo de archivos de salida XACT. El promer archivo que es generado es el archivo de configuraciónes globales, que por defecto tiene el mismo nombre que el archivo del proyecto XACT, pero con una extension .xgs. Si el archivo del proyecto XACT es llamado MyGameAudio.xap, el archivo de configuraciónes globales tendra el nombre por defecto MyGameAudio.xgs.
La construcción entonces genera uno o mas archivos de bancos de ondas, dependiendo del número de bancos de ondas que fueron añadidos al proyecto XACT por el diseñador de audio. Los archivos de bancos de ondas tienen una extension .xwb y fueron añadidos al proyecto XACT por el diseñador de audio. Por defecto , un banco de sonido tiene el nombre "Wave Bank.xwb.".
La construcción también genera uno o mas archivos de bancos de sonidos, dependiendo del número de bancos de sonidos que fueron añadidos al proyecto XACT por el diseñador de audio. Los archivos de bancos de sonidos tienen una extension .xsb y fueron añadidos al proyecto XACT por el diseñador de audio. Por defecto , un banco de sonido tiene el nombre "Sound Bank.xsb.".
Cargar estos archivoses parte de inicializar los objetos del codigo que son requerídos para reproducir audio usando el Framework de XNA. La carga es realizada como parte del constructor para cada objeto asociado en codigo. El archivo de configuraciones globaleses usado para construir la clase AudioEngine, la cual es entonces usada junto al archivo de banco de ondas para inicializar un objeto de tipo WaveBank, y con el archivo de banco de sonido para inicializar un objeto de tipo SoundBank.
La siguiente ilustración explica la relación de estos archivos como ellos van desde el tiempo para diseñarlos en el diseñador de audio, al momento de construir a travez de la tuberia de contenido, y finalmente a tiempo de ejecución, así como ellos estan cargados al inicio del videojuego.
El video de este paso demuestra el codigo necesario para cargar estos archivos.
BUENO, CON ESTO TERMINA EL TUTORIAL TRADUCIDO DE XNA PARA JUEGOS EN 3D, SI LES GUSTÓ POR FAVOR COMENTEN.
GRACIAS.