figuras - ¿Es el sistema de coordenadas OpenGL zurdo o diestro?
opengl pdf (6)
SOLO NDC
¡¡Solo debes darte cuenta de que OpenGL only knows NDC!!
, y es una coordenada a la izquierda. no importa qué coordenada use, la coordenada del eje izquierda, la mano derecha, etc. Todas necesitan ser reflejadas en NDC. Si lo desea, puede escribir totalmente el espacio-mundo en la coordenada izquierda.
¿Por qué usamos la coordenada derecha derecha en el espacio-mundo?
Creo que es convencional. Simplemente funciona. Tal vez solo quiera distinguir de DirectX.
Estoy tratando de entender el sistema de coordenadas OpenGL. Sin embargo, algunos tutoriales dicen que el sistema de coordenadas predeterminado es para zurdos (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 ). ¿Cual es correcta? Entiendo que podemos transformar uno al otro mediante el reflejo, pero me gustaría saber las coordenadas predeterminadas.
El libro "WebGl Programming Guide" de Kouichi Matsuda gasta casi diez páginas en "WebGl / OpenGl: diestro o zurdo".
De acuerdo con el libro:
En la práctica, la mayoría de las personas usa un sistema diestro
OpenGl en realidad es un sistema para zurdos internamente
Internamente, más profundamente, en realidad no es ninguno de los dos. En la parte inferior, a OpenGl no le importa el valor z. El orden en que dibujas las cosas determina lo que se dibuja en la parte superior (dibuja primero un triángulo, luego un cuadrángulo, el cuadrante reemplaza al triángulo).
No estoy totalmente de acuerdo con el "no es ninguno", pero esa es probablemente una pregunta filosófica de todos modos.
El sistema de coordenadas es diestro. El primer artículo parece estar mal.
Hay algo de confusión aquí.
OpenGL es diestro en el espacio de objetos y el espacio mundial.
Pero en el espacio de la ventana (también conocido como espacio de pantalla) de repente somos zurdos .
¿Cómo sucedió esto ?
La forma en que pasamos de diestro a zurdo es una entrada z negativa en las matrices de proyección glOrtho
o glFrustum
. Escalar z por -1 (dejando x e y tal como estaban) tiene el efecto de cambiar la destreza del sistema de coordenadas.
Para glFrustum,
lejos y cerca se supone que son positivos, con lejos > cerca . Diga far = 1000 y near = 1. Entonces C = - (1001) / (999) = -1.002.
Mira here para más detalles y diagramas.
Desde una perspectiva ortográfica , glOrtho genera una matriz como esta:
Aquí, izquierda , derecha , abajo y arriba son solo glOrtho .
Los planos cercano y lejano , 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. Esta distancia es negativa si el avión debe estar detrás del espectador.
y lejos:
- zFar La distancia al plano de recorte de profundidad más profunda. Esta distancia es negativa si el avión debe estar detrás del espectador.
Aquí tenemos un volumen típico de vista canónica
Debido a que el multiplicador z es (-2 / (muy cerca)), el signo menos efectivamente escala z por -1 . Esto significa que "z" se gira con la mano 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 NEAR PLANE tiene 10 unidades por delante . ¿Dónde estás? ¿Por qué, en el origen, con el eje x a su derecha, el eje y en la parte superior de la cabeza y la nariz apuntando hacia abajo del eje z negativo? (El valor predeterminado es "Por defecto, la cámara está situada en el origen , apunta hacia abajo del eje z negativo, y tiene un vector ascendente de (0, 1, 0). " ). Entonces, el plano cercano está en z = -10. El plano lejano está 10 unidades detrás de ti, en z = + 10 .
Opengl es definitivamente zurdo. Verá una gran cantidad de tutoriales que indican lo contrario porque están negando el valor z en la matriz de proyección. Cuando los vértices finales se computan dentro del sombreado de vértices, se convierten los vértices que se pasan del lado del cliente (coordinado a la derecha) a los zurdos, y los vértices se pasarán al sombreador de geometría y al sombreador de fragmentos. Si usa el sistema de coordenadas de la derecha en el lado del cliente, a Opengl no le importa. Solo conoce el sistema de coordenadas normalizado, que es zurdo.
Editar: si no confías en mí, simplemente prueba en tu sombreado de vértices agregando una matriz de traducción, y puedes ver fácilmente si Opengl es zurdo o no.
Por defecto, la Coordinación del Dispositivo Normalizado 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 para zurdos.
Cambiar el rango de profundidad a [1, 0] hará que el sistema sea diestro.
Citando una respuesta previa de Nicol : (la huelga es mi trabajo, se explica a continuación)
Me sorprende que nadie haya mencionado algo: OpenGL también funciona en un sistema de coordenadas para zurdos. Al menos, lo hace cuando trabajas con sombreadores y usas el rango de profundidad predeterminado.
Una vez que arroja la tubería de función fija, trata directamente con "clip-space". La especificación de OpenGL define el espacio de recorte como un sistema de coordenadas homogéneo 4D. Cuando sigue las transformaciones a través de coordenadas de dispositivo normalizadas y hasta el espacio de la ventana, lo encuentra.
El espacio de 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 yendo 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 de Z cercano a 0 y el valor de Z de lejos a uno . Entonces el + Z se va del espectador.
Es un sistema de coordenadas para zurdos. Sí tu puedes
cambie la prueba de profundidad de GL_LESS a GL_GREATER ycambie el glDepthRange de [0, 1] a [1, 0]. Pero el estado predeterminado de OpenGL es trabajar en un sistema de coordenadas para zurdos . Y ninguna de las transformaciones necesarias para llegar al espacio de la ventana desde el espacio de clip anula la Z. Así que el espacio de recorte, la salida del sombreador de vértice (o geometría) es un espacio zurdo (un poco. Es un espacio homogéneo 4D, entonces es difícil precisar la lateralidad).En la tubería de función fija, las matrices de proyección estándar (producidas por glOrtho, glFrustum y similares) se transforman de un espacio para diestros a uno para zurdos . Vuelven el significado de Z; solo revisa las matrices que generan. En el espacio del ojo, + 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.
Golpeé una parte ya que divergía de mis hallazgos.
Cambiar el DepthRange o el DepthFunc y usar ClearDepth (0) funciona, pero al usar ambos se cancelaron mutuamente a un sistema zurdo.