2010-08-20 12 views
6

Estoy empezando en XNA y tengo una pregunta sobre la rotación. Cuando multiplicas un vector por una matriz de rotación en XNA, va en sentido antihorario. Esto lo entiendo¿Qué es este comportamiento de rotación en XNA?

Sin embargo, déjame darte un ejemplo de lo que no entiendo. Digamos que cargué un activo de arte al azar en la tubería. Luego creo una variable para incrementar cada fotograma en 2 radianes cuando se ejecuta el método de actualización (testRot + = 0.034906585f). Lo principal de mi confusión es que el activo gira en el sentido de las agujas del reloj en este espacio de pantalla. Esto me confunde ya que una matriz de rotación rotará un vector en el sentido contrario a las agujas del reloj.

Otra cosa, cuando especifico dónde está mi vector de posición, así como mi origen, entiendo que estoy girando sobre el origen. ¿Debo suponer que también hay ejes perpendiculares que pasan por el origen de este activo? De ser así, ¿dónde comienza la rotación? En otras palabras, ¿estoy comenzando la rotación desde la parte superior del eje Y o el eje X?

+0

@llya - Probablemente deberías aceptar las respuestas a tus otras preguntas para que otros quieran responder a tu pregunta. – TheCloudlessSky

+0

Hecho, aceptado todo. Lo siento muchachos, lo olvidé. – Ilya

Respuesta

11

XNA SpriteBatch funciona en Espacio de cliente. Donde "arriba" es Y-, no Y + (como en el espacio cartesiano, espacio de proyección, y lo que la mayoría de las personas suele seleccionar para su espacio mundial). Esto hace que la rotación aparezca en el sentido de las agujas del reloj (no en sentido antihorario, como ocurriría en el espacio cartesiano). Las coordenadas reales que produce la rotación son las mismas.

Las rotaciones son relativas, por lo que realmente no "comienzan" desde ninguna posición especificada.

Si está utilizando funciones matemáticas como sin o cos o atan2, entonces absolutos ángulos siempre comienzan desde el X + eje como cero radianes, y la dirección de rotación positiva gira hacia Y +.


El orden de las operaciones de SpriteBatch se ve algo como esto:

  1. Sprite comienza como un patio con la esquina superior izquierda en (0,0), siendo el mismo que su textura su tamaño tamaño (o SourceRectangle).
  2. Traducir el sprite de nuevo por su origen (colocando así su origen en (0,0)).
  3. Escala el sprite
  4. Girar el sprite
  5. Traducir el sprite por su posición
  6. Aplicar la matriz de SpriteBatch.Begin

Esto coloca el sprite en el espacio de cliente.

Finalmente, se aplica una matriz a cada lote para transformar ese espacio de cliente en el espacio de proyección utilizado por la GPU. (El espacio de proyección es desde (-1, -1) en la parte inferior izquierda de la ventana gráfica, hasta (1,1) en la esquina superior derecha.)

+1

Wow, gracias hombre. Explicado muy bien. Busqué tutoriales/libros y todo lo que hicieron fue hablar sobre estos sin entrar en profundidad. – Ilya

+0

@llya: De nada. (PD: no te olvides de votar y aceptar :) –

2

Como usted es nuevo en XNA, permítame presentarle una biblioteca que te ayudará mucho mientras aprendes. Se llama XNA Debug Terminal y es un proyecto de código abierto que le permite ejecutar código arbitrario durante el tiempo de ejecución. Para que pueda ver si sus variables tienen el valor que espera. Todo esto sucede en una pantalla de terminal en la parte superior de tu juego y sin detener tu juego. Se puede descargar al http://www.protohacks.net/xna_debug_terminal Es gratis y muy fácil de configurar, por lo que realmente no tiene nada que perder.

Cuestiones relacionadas