¿El sistema de coordenadas OpenGL es zurdo o diestro?


Estoy tratando de entender el sistema de coordenadas OpenGL. Sin embargo, algunos tutoriales dicen que el sistema de coordenadas predeterminado es zurdo (ver http://www.c-sharpcorner.com/UploadFile/jeradus/OpenGLBasics11172005014307AM/OpenGLBasics.aspx) y otros dicen que es diestro (ver http://www.falloutsoftware.com/tutorials/gl/gl0.htm ). ¿Cuál es correcto? Entiendo que podemos transformar uno a otro reflejando, pero me gustaría saber las coordenadas predeterminadas.

Author: genpfault, 2010-11-08

6 answers

El sistema de coordenadas es diestro. El primer artículo parece estar equivocado.

 -7
Author: tibur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-08 13:03:42

Hay cierta confusión aquí.

introduzca la descripción de la imagen aquí

OpenGL es diestro en el espacio de objetos y el espacio del mundo.

Pero en el espacio de la ventana (también conocido como espacio de la pantalla) somos de repente zurdos.

¿Cómo sucedió esto?

La forma en que pasamos de diestro a zurdo es una entrada de escala z negativa en el glOrtho o glFrustum matrices de proyección. Escalar z por -1 (dejando x e y como estaban) tiene el efecto de cambiar la manejabilidad del sistema de coordenadas.

Para glFrustum,

introduzca la descripción de la imagen aquíintroduzca la descripción de la imagen aquí

far y near se supone que son positivos, con far > cerca de . Digamos lejos =1000 y cerca =1. Entonces C= -( 1001 ) / ( 999 ) = -1.002.

Ver aquí para más detalles y diagramas.

Desde una perspectiva ortográfica , glOrtho genera una matriz como esta:

introduzca la descripción de la imagen aquí

Aquí, a la izquierda, derecho, parte inferior y top son sólo las coordenadas vertical izquierdo, vertical derecho, horizontal inferior, la parte superior horizontal planos de recorte (resp).

Los planos cerca de y lejos, sin embargo, se especifican de manera diferente. El parámetro near se define como

  • Cerca: La distancia al plano de recorte de profundidad más cercano. Este la distancia es negativa si el plano debe estar detrás del espectador.

Y far:

  • zFar La distancia al plano de recorte de mayor profundidad. Esta distancia es negativa si el plano debe estar detrás del espectador.

Aquí tenemos un típico volumen de vista canónica

canónico

Debido a que el multiplicador z es (-2/(muy cerca)), el signo menos escala efectivamente z por -1. Esto significa que" z " es dado vuelta a la izquierda durante la transformación de visualización, sin el conocimiento de la mayoría de las personas, ya que simplemente trabajan en OpenGL como un sistema de coordenadas "diestro".

Entonces, si llamas

glOrthof(-1, 1, -1, 1, 10, -10) ; // near=10, FAR=-10,

Entonces el PLANO CERCANO está 10 unidades delante de ti. ¿Dónde están? Por qué, en el origen, con el eje x a tu derecha, el eje y en la parte superior de tu cabeza, y tu nariz apuntando hacia abajo el eje z negativo (eso es lo predeterminado "Por defecto, la cámara está situada en el origen, apunta hacia abajo el eje z negativo, y tiene un vector ascendente de (0, 1, 0)."). Así que el plano cercano está en z = -10. El plano lejano está 10 unidades detrás de ti, a z=+10.

 113
Author: bobobobo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-17 18:24:38

De forma predeterminada, la Coordenada de Dispositivo normalizada es zurda.

El glDepthRange es por defecto [0, 1] (cerca, lejos) haciendo que el eje +z apunte a la pantalla y con +x a la derecha y +y arriba es un sistema zurdo.

Cambiar el rango de profundidad a [1, 0] hará que el sistema sea diestro.

Citando una respuesta anterior de Nicol : (el strike-through es mi trabajo, explicado a continuación)

Me sorprende que nadie haya mencionado algo: OpenGL funciona en un sistema de coordenadas para zurdos también. Al menos, lo hace cuando está trabajando con sombreadores y utiliza el rango de profundidad predeterminado.

Una vez que arroje la canalización de función fija, tratará directamente con "clip-space". La especificación OpenGL define el espacio de clip como un sistema de coordenadas homogéneo 4D. Al seguir las transformaciones a través de las coordenadas normalizadas del dispositivo, y hasta el espacio de la ventana, se encuentra esto.

El espacio de la ventana está en el espacio de los píxeles de una ventana. El origen está en la esquina inferior izquierda, con +Y subiendo y + X a la derecha. Eso suena muy parecido a un sistema de coordenadas diestro. ¿Pero qué hay de Z?

El rango de profundidad predeterminado (glDepthRange) establece el valor Z cercano a 0 y el valor Z lejano a uno. Así que el + Z va lejos del espectador.

Es un sistema de coordenadas para zurdos. Sí, puede cambiar la prueba de profundidad de GL_LESS a GL_GREATER y cambiar el rango de profundidad de GLD de [0, 1] a [1, 0]. Pero el estado predeterminado de OpenGL es trabajar en un sistema de coordenadas zurdo. Y ninguna de las transformaciones necesarias para llegar al espacio de la ventana desde el espacio de clip niega la Z. Por lo que el espacio de clip, la salida del sombreador de vértices (o geometría) es un espacio para zurdos (un poco. Es un espacio homogéneo 4D, por lo que es difícil precisar la handedness).

En la canalización de función fija, las matrices de proyección estándar (producidas por glOrtho, glFrustum y similares) se transforman a partir de espacio para diestros a uno para zurdos. Cambian el significado de Z; simplemente comprueban las matrices que generan. En el espacio ocular, +Z se mueve hacia el espectador; en el espacio posterior a la proyección, se aleja.

Sospecho que Microsoft (y GLide) simplemente no se molestaron en realizar la negación en sus matrices de proyección.

Hice huelga una parte ya que divergió de mis hallazgos.

Ya sea cambiando el rango de profundidad o el fondo de profundidad y usando el ClearDepth (0) funciona, pero cuando se utilizan ambos se cancelan entre sí de nuevo a un sistema zurdo.

 23
Author: hultqvist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-12 07:31:21

SOLO NDC

Solo debe notar que OpenGL only knows NDC!!,y es una coordenada izquierda. no importa qué coordenada use,coordenada de eje izquierda, derecha, etc.Todos necesitan ser reflejados en NDC. Si lo desea, puede escribir totalmente espacio-mundo en coordenada izquierda.

¿Por qué usamos la coordenada derecha derecha en el mundo-espacio?

Creo que es conventional.It simplemente lo hace.Tal vez sólo quiere distinguir de DirectX.

 10
Author: ZK_,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-02 15:56:36

El libro "WebGL Programming Guide" de Kouichi Matsuda dedica casi diez páginas a " WebGL / OpenGL: Left or Right Handed?"

Según el libro:

  • En la práctica, la mayoría de las personas utilizan un sistema diestro

  • OpenGL en realidad es un sistema para zurdos internamente

  • Internamente, más profundamente, en realidad no es ninguna de las dos cosas. En la parte inferior OpenGL no se preocupa por el valor z. El orden en el que se dibujan las cosas determina lo que se dibuja en la parte superior (dibuja un triángulo primero, luego un quad, el quad anula el triángulo).

No estoy totalmente de acuerdo con el "no es ninguno de los dos", pero eso es probablemente una pregunta filosófica de todos modos.

 5
Author: Heinzlmaen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-04 09:06:59

Opengl es definitivamente zurdo. Se ven muchos tutoriales que indican lo contrario porque están negando el valor z en la matriz de proyección. Cuando los vértices finales se calculan dentro de vertex shader, está convirtiendo los vértices que pasas del lado cliente (coord derecho) a zurdos, y los vértices se pasarán al sombreador de geometría y al sombreador de fragmentos. Si utiliza el sistema de coordenadas derecho en el lado del cliente, Opengl no le importa. Sólo conoce coordenadas normalizadas sistema, que es zurdo.

Editar: Si no confías en mí, simplemente experimenta con tu sombreador de vértices agregando una matriz de traducción, y podrás ver fácilmente si Opengl es zurdo o no.

 2
Author: ForeignDevil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-28 07:20:07