Escuché que en un juego OpenGL lo que hacemos para que el jugador se mueva no es mover la cámara, sino mover el mundo entero.
Por ejemplo, aquí hay un extracto de este tutorial: matriz de vista OpenGL
En la vida real, estás acostumbrado a mover la cámara para alterar la vista de una escena determinada, en OpenGL es al revés. La cámara en OpenGL no puede moverse y está definida para ubicarse en (0,0,0) mirando hacia la dirección Z negativa. Eso significa que en lugar de mover y girar la cámara, el mundo se mueve y gira alrededor de la cámara para construir la vista adecuada.
¿Por qué hacemos eso?
Respuestas:
Por qué ?
Porque, una cámara representa una vista de proyección.
Entendiendo Matemáticamente
La Vista de proyección se mueve por el espacio y cambia su orientación. Lo primero que debe notar es que la proyección deseada en la pantalla no cambia con la dirección de la vista.
Por esta razón, transformamos otras cosas para obtener la proyección deseada.
Entendiendo de http://opengl.org
Para dar la apariencia de mover la cámara, su aplicación OpenGL debe mover la escena con el inverso de la transformación de la cámara. en lo que respecta a OpenGL, no hay cámara. Más específicamente, la cámara siempre se encuentra en la coordenada del espacio ocular (0, 0, 0)
Entendiendo de http://open.gl
También quiero compartir las siguientes líneas de la parte Ver matriz de http://open.gl/transformations
Comprensión por perspectiva
En el mundo real, vemos las cosas de una manera que se llama "perspectiva".
La perspectiva se refiere al concepto de que los objetos que están más lejos parecen ser más pequeños que los que están más cerca de usted. La perspectiva también significa que si está sentado en medio de una carretera recta, verá los bordes de la carretera como dos líneas convergentes.
Eso es perspectiva. La perspectiva es crítica en proyectos 3D. Sin perspectiva, el mundo 3D no parece real.
Si bien esto puede parecer natural y obvio, es importante tener en cuenta que cuando crea una representación 3D en una computadora está intentando simular un mundo 3D en la pantalla de la computadora, que es una superficie 2D.
Imagine que detrás de la pantalla de la computadora hay una especie de escena 3D real, y la está viendo a través del "cristal" de la pantalla de su computadora. Usando la perspectiva, su objetivo es crear un código que represente lo que se "proyecta" en este "cristal" de su pantalla como si hubiera un mundo 3D real detrás de la pantalla. La única advertencia es que este mundo 3D no es real ... es solo una simulación matemática de un mundo 3D.
Entonces, cuando se usa la representación 3D para simular una escena en 3D y luego se proyecta la escena 3D en la superficie 2D de la pantalla, el proceso se llama proyección en perspectiva.
Comience visualizando intuitivamente lo que desea lograr. Si un objeto está más cerca del espectador, el objeto debe parecer más grande. Si el objeto está más lejos, debe parecer más pequeño. Además, si un objeto se aleja del espectador, en línea recta, desea que converja hacia el centro de la pantalla, ya que se aleja más en la distancia.
Traduciendo la perspectiva a las matemáticas
Mientras observa la ilustración en la siguiente figura, imagine que un objeto se coloca en su escena 3D. En el mundo 3D, la posición del objeto puede describirse como xW, yW, zW, refiriéndose a un sistema de coordenadas 3D con el origen en el punto del ojo. Ahí es donde realmente se coloca el objeto, en la escena 3D más allá de la pantalla.
A medida que el espectador mira este objeto en la pantalla, el objeto 3D se "proyecta" en una posición 2D descrita como xP e yP, que hace referencia al sistema de coordenadas 2D de la pantalla (plano de proyección).
Para poner estos valores en una fórmula matemática, usaré un sistema de coordenadas 3D para las coordenadas mundiales, donde el eje x apunta a la derecha, y apunta hacia arriba y puntos z positivos dentro de la pantalla. El origen 3D se refiere a la ubicación del ojo del espectador. Entonces, el vidrio de la pantalla está en un plano ortogonal (en ángulo recto) al eje z, en algún z que llamaré zProj.
Puede calcular las posiciones proyectadas xP e yP, dividiendo las posiciones mundiales xW e yW, por zW, de esta manera:
K1 y K2 son constantes que se derivan de factores geométricos como la relación de aspecto de su plano de proyección (su ventana de visualización) y el "campo de visión" de su ojo, que tiene en cuenta el grado de visión gran angular.
Puedes ver cómo esta transformación simula la perspectiva. Los puntos cerca de los lados de la pantalla se empujan hacia el centro a medida que aumenta la distancia desde el ojo (zW). Al mismo tiempo, los puntos más cercanos al centro (0,0) se ven mucho menos afectados por la distancia desde el ojo y permanecen cerca del centro.
Esta división por z es la famosa "división de perspectiva".
Ahora, considere que un objeto en la escena 3D se define como una serie de vértices. Entonces, al aplicar este tipo de transformación a todos los vértices de la geometría, efectivamente se asegura de que el objeto se encoja cuando esté más alejado del punto del ojo.
Otros casos importantes
Para comprender mejor las cámaras 3D, imagine que está filmando una película. Debes configurar una escena que quieras fotografiar y necesitas una cámara. Para obtener el metraje, recorrerá la escena con su cámara, disparando los objetos en la escena desde diferentes ángulos y puntos de vista.
El mismo proceso de filmación ocurre con una cámara 3D. Necesita una cámara "virtual", que puede recorrer la escena "virtual" que ha creado.
Dos estilos de disparo populares implican mirar el mundo a través de los ojos de un personaje (también conocido como cámara en primera persona) o apuntar la cámara a un personaje y mantenerlo a la vista (conocido como cámara en tercera persona).
Esta es la premisa básica de una cámara 3D: una cámara virtual que puede usar para recorrer una escena 3D y renderizar el metraje desde un punto de vista específico.
Comprender el espacio mundial y ver el espacio
Para codificar este tipo de comportamiento, representará el contenido del mundo 3D desde el punto de vista de la cámara, no solo desde el punto de vista del sistema de coordenadas del mundo, o desde algún otro punto de vista fijo.
En términos generales, una escena 3D contiene un conjunto de modelos 3D. Los modelos se definen como un conjunto de vértices y triángulos, referenciados a su propio sistema de coordenadas. El espacio en el que se definen los modelos se denomina espacio modelo (o local).
Después de colocar los objetos del modelo en una escena 3D, transformará los vértices de estos modelos utilizando una matriz de "transformación del mundo". Cada objeto tiene su propia matriz mundial que define dónde está el objeto en el mundo y cómo está orientado.
Este nuevo sistema de referencia se denomina "espacio mundial" (o espacio global). Una forma sencilla de gestionarlo es asociando una matriz de transformación mundial a cada objeto.
Para implementar el comportamiento de una cámara 3D, deberá realizar pasos adicionales. Hará referencia al mundo, no al origen mundial, sino al sistema de referencia de la cámara 3D.
Una buena estrategia consiste en tratar la cámara como un objeto 3D real en el mundo 3D. Como cualquier otro objeto 3D, utiliza una matriz de "transformación del mundo" para colocar la cámara en la posición y orientación deseadas en el mundo 3D. Esta matriz de transformación del mundo de la cámara transforma el objeto de la cámara desde el original, mirando hacia adelante la rotación (a lo largo del eje z), a la posición del mundo real (xc, yc, zc) y la rotación del mundo.
La siguiente figura muestra las relaciones entre el sistema de coordenadas Mundo (x, y, z) y el sistema de coordenadas Vista (cámara) (x ', y', z ').
fuente
glMatrixMode()
y algunas funciones más que se mencionan en: eng.utah.edu/~cs6360/Lectures/frustum.pdf y opengl.org/archives/resources/faq/technical/viewing.htm están en desuso. Sin embargo, la descripción matemática sigue siendo correcta y útil.La respuesta de Mahbubar R Aaman es bastante correcta y los enlaces que proporciona explican las matemáticas con precisión, pero en el caso de que desee una respuesta menos técnica / matemática, intentaré un enfoque diferente.
Las posiciones de los objetos en el mundo real y en el mundo del juego se definen con algún sistema de coordenadas. Un sistema de coordenadas da sentido a los valores de posición. Si te digo que estoy en "100,50", eso no te ayudará a menos que sepas qué significan esos números (son millas, kilómetros, latitud y longitud, etc.). Si son coordenadas cartesianas (el tipo de coordenadas "normales"), también necesita saber a qué origen se refieren; si solo digo "Estoy a 100 pies hacia el este", necesitas saber "al este de qué ", que se llama origen de coordenadas.
Hay una manera fácil de pensar en esto. Se podría decir a alguien "la estación de tren está a 3 kilómetros al norte y 1,5 kilómetros al este de la esquina suroeste de la ciudad". También podría decirle a alguien "la estación de tren está a 1 milla directamente al norte de donde estoy ahora". Ambas coordenadas son correctas e identifican la ubicación del mismo punto de referencia, pero se miden desde un origen diferente y, por lo tanto, tienen valores numéricos diferentes.
En una aplicación 3D, generalmente hay un sistema de coordenadas "mundial", que se usa para representar la posición de la cámara y los objetos en el juego, medido con coordenadas cartesianas con algún origen arbitrario especificado por el diseñador (generalmente el centro de cualquier nivel o mapa que estás jugando). Existen otros sistemas de coordenadas en el juego, como el sistema de coordenadas cartesianas con la cámara en el origen. Puede definir cualquier nuevo sistema de coordenadas de la forma que desee en cualquier momento que desee, y esto se hace con mucha frecuencia en la simulación 3D para facilitar las cosas para las matemáticas.
El algoritmo que realmente representa un triángulo individual en su pantalla funciona de una manera particular, por lo que no es conveniente trabajar directamente con las coordenadas mundiales cuando se procesa. La matemática no está realmente preparada para tratar información como "el objeto está a 100 unidades a la derecha del centro del mundo". En cambio, las matemáticas quieren trabajar con "el objeto está directamente frente a la cámara y a 20 unidades de distancia". Por lo tanto, se agrega un paso adicional a la matemática de renderizado para tomar posiciones mundiales de objetos y traducirlas al sistema de coordenadas de la cámara.
Por supuesto, la cámara tiene una posición y una orientación también. Entonces, si un objeto está en la posición 20,100,50 y la cámara está en la posición 10,200, -30, la posición del objeto con respecto a la cámara es 10,100,80 (la posición del objeto menos la posición de la cámara). Cuando la cámara se mueve en un juego, esa posición de la cámara en las coordenadas mundiales se mueve exactamente como cabría esperar.
Tenga en cuenta que los objetos no se mueven; se están quedando donde estaban antes. Sin embargo, su posición ahora se expresa en relación con un origen de coordenadas diferente. Las coordenadas mundiales del objeto solo se mueven si el objeto en sí se mueve, pero las coordenadas de su cámara también cambian cada vez que la cámara se mueve, ya que son relativas a la posición de la cámara.
También tenga en cuenta que la descripción del tutorial que está citando es una explicación simplificada y no necesariamente una descripción precisa de lo que hace OpenGL. No creo que el autor del artículo no haya entendido eso; El autor simplemente trató de usar una analogía simplificada que en este caso causó confusión en lugar de eliminarla.
Si ayuda a entender por qué las matemáticas se preocupan por las coordenadas de la cámara, intente este ejercicio: levante las manos tocando los pulgares e índices juntos para formar un rectángulo (llamémosle "ventana") y mire a su alrededor la habitación donde está adentro. Busque un objeto y mírelo, luego mire a su alrededor pero no directamente a él. Cuando lo haga, pregúntese: "¿dónde está el objeto en mi ventana gráfica?" Ese objeto tiene una longitud y latitud específicas del mundo real que puedes usar para determinar su ubicación en la Tierra, pero eso no te dice nada sobre lo que estás viendo. Sin embargo, decir "el objeto está en la esquina superior izquierda de mi ventana y parece estar a unos 2 metros de distancia". Has creado un sistema de coordenadas relativo a tu cabeza y la dirección mira que define dónde está un objeto según tu visión. Eso es básicamente lo que necesita la parte del rasterizador triangular de OpenGL / Direct3D, y eso es lo que las matemáticas requieren para que las posiciones y la orientación de los objetos se transformen de sus convenientes coordenadas mundiales en coordenadas de cámara.
fuente
Simplemente agregando a los otros dos (excelente) responde algunas explicaciones adicionales sobre un punto que Mahbubur R. Aaman mencionó: "no hay cámara".
Esto es bastante cierto y representa una falla de la analogía común de "cámara", porque la "cámara" en realidad no existe. Es importante darse cuenta de que la analogía de la cámara es exactamente eso: una analogía. No describe (ni pretende describir) la forma en que las cosas funcionan realmente detrás de escena.
Por lo tanto, considérelo (un juego de palabras) como un medio para ayudarlo a entender esto si es nuevo para usted, pero siempre recuerde que es solo una ayuda y no una descripción de cómo son las cosas en realidad.
Ahora, tiene dos clases de objetos que son relevantes aquí: el punto de vista y todo en el mundo. Desea mover el punto de vista más cerca de algunos objetos, pero para este movimiento el resultado final es el mismo si la vista se acerca a los objetos o si los objetos se acercan a la vista. Todo lo que estás haciendo es cambiar la distancia entre ellos; dado que la distancia actual es X y desea que la nueva distancia sea Y, no importa cuál se mueva, siempre que después del movimiento la nueva distancia sea Y. Así que no se está moviendo en absoluto, usted solo estás cambiando una distancia. (No quise hablar de todo Einstein en esto ... ¡honesto!)
Pero, sin embargo, dado que la cámara no existe, lo único de lo que puede cambiar la distancia es de los objetos. Entonces cambias la distancia de los objetos y sale el mismo resultado. Como todos los objetos pasan por transformaciones de todos modos , esto no es más ni menos costoso.
Una explicación matemática más simple puede ayudar más. Supongamos que todas las coordenadas son 1D: el punto de vista está en 0, sus objetos están en 4 y desea que el punto de vista vaya a 3. Eso significa que la distancia entre ellos cambiará de 4 (4 - 0) a 1 (4 - 3) Pero como la cámara no existe, no puede cambiar ese 0; siempre será 0. Entonces, en lugar de sumar 3 a 0 (lo que no puedes hacer), restas 3 de 4 (lo que puedes hacer): los objetos ahora están en 1 y el resultado final es el mismo: la distancia entre punto de vista y objetos es 1.
fuente
Mover la cámara o mover el mundo son dos opciones igualmente válidas que equivalen a lo mismo. Al final del día, está cambiando de un sistema de coordenadas a otro. Las respuestas anteriores son correctas, pero de qué manera lo visualiza son dos caras de la misma moneda. Las transformaciones pueden ir en cualquier dirección: son solo el inverso el uno del otro.
Parte del proceso de renderizado se convierte de coordenadas mundiales a coordenadas oculares. Sin embargo, una manera fácil de modelar esto es con un objeto de cámara virtual en su aplicación. La cámara puede representar tanto la matriz de proyección (que es responsable del efecto de perspectiva) como también la matriz de vista que se utiliza para convertir del espacio mundial al espacio ocular.
Entonces, aunque el sombreador de vértices usa la matriz de vista para cambiar las coordenadas de su geometría al espacio del ojo, a menudo es más fácil pensar en un objeto de cámara que se mueve alrededor de su mundo virtual que, a medida que se mueve, vuelve a calcular la matriz de vista.
Entonces, en su aplicación, mueve la cámara en coordenadas mundiales, actualiza la matriz de vista de cámara, pasa la nueva matriz de vista al sombreador de vértices como un uniforme o parte del bloque, renderiza su escena.
fuente
En cambio, diría que es una analogía defectuosa. En su forma más básica, "mover la cámara" y "mover el mundo" son exactamente la misma construcción matemática: es solo que mover el mundo es algo más fácil de pensar conceptualmente, especialmente cuando se trata de transformaciones jerárquicas. Básicamente, estás moviendo el mundo alrededor de la cámara solo porque estás traduciendo los vértices del mundo al espacio de coordenadas de la cámara, pero esta es una transformación afín reversible.
Sin embargo, cuando comienza a aportar determinación de visibilidad a la mezcla, lo ÚLTIMO que desea hacer es traducir todo el mundo alrededor de la cámara. En cambio, en la mayoría de los casos (especialmente en el caso clásico de BSP fijos o similares), va a utilizar la posición de la cámara en el mundo para consultar sus estructuras de visibilidad para determinar qué cosas es probable que sean visibles, y luego solo traducir AQUELLAS cosas en el espacio de coordenadas de la cámara.
fuente
No creo que la afirmación sea categóricamente cierta, ya que uno rara vez "mueve" las coordenadas mundiales en un juego, pero en realidad cambia las coordenadas de la cámara virtual.
Lo que realmente hace el concepto de cámara es transformar el tronco de visión finito, es decir, una pirámide truncada con 8 puntos de esquina (o definidos por la intersección de 6 planos) en un cubo unitario, que representa el espacio de clip en las etapas finales de openGL canalización de representación.
En ese sentido, el mundo no se mueve, solo se calculan las coordenadas mundiales en el sistema de coordenadas del espacio de recorte.
fuente
Mover la cámara o mover el mundo son dos opciones igualmente válidas (y ambas son ciertas). Al final del día, estamos cambiando de un sistema de coordenadas a otro. Las transformaciones pueden ir en cualquier dirección: son solo el inverso el uno del otro.
fuente
Muchas buenas respuestas aquí. Intentaré no repetir ninguno de ellos. A veces es más fácil pensar en términos de una cámara, como lo hace Direct3D (nota: no he jugado con muchas publicaciones 9.0c)
"Mover el mundo" como en el sentido de Futurama de que alguien citado por ahí es una muy buena manera de verlo ("Los motores no mueven la nave en absoluto. La nave se queda donde está y los motores mueven el universo alrededor ¡eso!"). En realidad, esto era bastante común para los juegos en 2D. Literalmente tenía una ventana gráfica que le costaría mucho ajustar, y esa era a veces su RAM de video o una ventana de IU. Si OpenGL lo hace por ese tipo de razones, eh, difícil de decir.
Ciertamente, también puede pensar en un movimiento 2D en términos de una cámara, y solo ese tipo de proceso de pensamiento puede facilitar la comprensión de los efectos.
fuente
Parece que hay un montón de malentendidos aquí, comenzando por los escritores de documentos de OpenGL ...
Permíteme restaurar tu cordura rápidamente: el mundo no se mueve , se queda quieto. Quien intente implementar el mundo mientras se mueve alrededor del jugador rápidamente tendrá problemas en el modo multijugador. Sin mencionar que actualizar las posiciones de millones (o miles de millones) de objetos en el mundo con el movimiento de cada jugador hará que el juego sea bastante lento ...
Entonces, ¿qué sucede realmente allí y qué pasa con la cita?
Bueno, antes que nada debes entender el concepto de un sistema de coordenadas. Generalmente, eliges un punto en el mundo y declaras que es el "origen", es decir, un punto con coordenadas (0,0,0). También elige tres direcciones "principales", a las que llama X, Y y Z. Obviamente, hay muchas formas de asignar un sistema de coordenadas. Usualmente hay un "sistema de coordenadas mundiales", en este sistema el mundo es estacionario (más o menos). En un juego, este sistema sería elegido por el diseñador de niveles.
Ahora, también es conveniente considerar otro sistema de coordenadas, vinculado al ojo del jugador. En este sistema de coordenadas, el jugador siempre está en coordenadas (0,0,0), y el mundo se mueve y gira a su alrededor. Por lo tanto, la cita es correcta si comprende que se hace en el sistema de coordenadas del jugador .
Sin embargo, el mundo no opera en las coordenadas del jugador, funciona en las coordenadas del mundo. Y donde están involucrados dos sistemas de coordenadas, siempre hay una manera de transformar un tipo de coordenadas en el otro. En OpenGL esto se hace usando una matriz de vista 4x4.
Finalmente, cuando un jugador se mueve, el mundo permanece estacionario, mientras que el jugador se mueve. Esto está en las coordenadas mundiales, la forma en que los objetos se almacenan en tu juego. El jugador también tiene una cámara de visión asociada con él, y esta cámara se mueve de manera similar en todo el mundo (a pesar de lo que parecen decir los documentos de OpenGL). Sin embargo, para mostrar el mundo en la pantalla del usuario, las coordenadas de todos los objetos visibles se traducen en el sistema de coordenadas del jugador utilizando una matriz de transformación, y luego se aplica una proyección adicional para crear un efecto de perspectiva. En el sistema de coordenadas de este jugador, el mundo parece moverse alrededor del jugador. Pero es solo una forma extremadamente inútil y confusa de pensarlo.
fuente