matrices opengl matrix camera coordinates projection

matrices - camera in opengl



¿Qué son exactamente las coordenadas del espacio del ojo? (2)

El espacio visual, el espacio visual y el espacio de la cámara son todos sinónimos de la misma cosa: el mundo en relación con la cámara.

Como estoy aprendiendo OpenGL, a menudo tropiezo con las llamadas coordenadas del espacio visual.

Si estoy en lo cierto, normalmente tienes tres matrices. Matriz de modelo, matriz de vista y matriz de proyección. Aunque no estoy del todo seguro de cómo funcionan las matemáticas detrás de eso, sé que la conversión se coordina con el espacio mundial, el espacio y el espacio de la pantalla.

Pero, ¿dónde está el espacio visual y qué matrices necesito para convertir algo en espacio visual?


Tal vez la siguiente ilustración que muestra la relación entre los diversos espacios ayude:

Dependiendo de si está utilizando la canalización de función fija (lo está si llama a glMatrixMode() , por ejemplo), o usa sombreadores, las operaciones son idénticas; solo se trata de si las codifica directamente en un sombreador, o si OpenGL pipeline ayuda en su trabajo.

Si bien hay disgusto al discutir las cosas en términos de la tubería de función fija, hace que la conversación sea más simple, así que comenzaré allí.

En OpenGL heredado (es decir, versiones anteriores a OpenGL 3.1 o usando perfiles de compatibilidad), se definen dos pilas de matriz: modelo-vista y proyección , y cuando una aplicación comienza, la matriz en la parte superior de cada pila es una matriz de identidad (1.0 en la diagonal, 0.0 para todos los demás elementos). Si dibujas coordenadas en ese espacio, estás representando efectivamente en coordenadas de dispositivo normalizadas (NDC), que recorta cualquier vértice fuera del rango [-1,1] en X, Y y Z. La transformación de la ventana gráfica (como establecer llamando a glViewport() ) es lo que mapea los NDC en coordenadas de ventana (bueno, las coordenadas de la vista, en realidad, pero la mayoría de las veces la ventana y el visor son del mismo tamaño y ubicación), y el valor de profundidad del rango de profundidad (que es [ 0,1] por defecto).

Ahora, en la mayoría de las aplicaciones, la primera transformación que se especifica es la transformación de proyección , que se presenta en dos variedades: proyecciones ortográficas y de perspectiva. Una proyección ortográfica preserva ángulos, y se usa generalmente en aplicaciones científicas y de ingeniería, ya que no distorsiona las longitudes relativas de los segmentos de línea. En OpenGL heredado, las proyecciones ortográficas están especificadas por glOrtho o gluOrtho2D . Las transformadas en perspectiva , que imitan la forma en que funciona el ojo (es decir, los objetos alejados del ojo son más pequeños que los cercanos), y se especifican mediante glFrustum o gluPerspective glFrustum gluPerspective . Para las proyecciones de perspectiva, definieron un tronco truncado, que es una pirámide truncada anclada en la ubicación del ojo, que se especifican en coordenadas oculares . En las coordenadas del ojo, el "ojo" se encuentra en el origen y mirando hacia abajo en el eje -Z. Sus planos de recorte cercanos y lejanos se especifican como distancias a lo largo del eje -Z. Si renderiza en coordenadas oculares, cualquier geometría especificada entre los planos de recorte cercanos y lejanos, y dentro del tronco tridimensional no se eliminará, y se transformará para que aparezca en la ventana gráfica. Aquí hay un diagrama de una proyección en perspectiva y su relación con el plano de la imagen .

El ojo se encuentra en el vértice del visor truncado.

La última transformación para analizar es la transformación modelo-vista , que es responsable de mover los sistemas de coordenadas (y no los objetos, más sobre eso en un momento) de modo que estén bien posicionados en relación con el ojo y el visor triturado. Las transformaciones de modelado comunes son traducciones , escalas , rotaciones y cizallas (de las cuales no hay soporte nativo en OpenGL).

En términos generales, los modelos 3D se modelan alrededor de un sistema de coordenadas local (por ejemplo, especificando las coordenadas de una esfera con el origen en el centro). Las transformaciones de modelado se utilizan para mover el sistema de coordenadas "actual" a una nueva ubicación, de modo que cuando renderice su objeto modelado localmente, se lo coloque en el lugar correcto.

No hay diferencia matemática entre una transformación de modelado y una transformación de visualización. Por lo general, las transformaciones de modelado se utilizan para modelos específicos y están controladas por las glPushMatrix() y glPopMatrix() , que generalmente se especifica primero una transformación de visualización y afecta a todas las operaciones de modelado posteriores.

Ahora, si está haciendo este OpenGL moderno (versiones de perfil central 3.1 y hacia adelante), tiene que hacer todas estas operaciones lógicamente usted mismo (puede especificar solo una transformación doblando tanto la vista de modelo como las transformaciones de proyección en una única matriz multiplicada) . Las matrices se especifican generalmente como uniforms sombreado. No hay pilas de matriz, separación de la vista de modelo y las transformaciones de proyección, y es necesario que su matemática sea correcta para emular la tubería. (Por cierto, la división de perspectiva y los pasos de transformación de ventana gráfica son realizados por OpenGL después de completar su sombreado de vértices; no es necesario que haga los cálculos matemáticos [puede, no hace daño a menos que no configure w en 1.0 en tu salida de sombreador de vértices gl_Position ).