Pensé en publicar en Stack Overflow, pero la pregunta me parece demasiado subjetiva ya que no puedo pensar en una explicación técnica razonable para la elección de Microsoft en este asunto. Pero esta pregunta me ha molestado durante tanto tiempo y el problema sigue apareciendo en uno de mis proyectos, y nunca he visto un intento de explicar esto:
OpenGL utiliza un sistema de coordenadas diestro, donde la parte + Z del sistema de coordenadas mundial se extiende hacia el espectador.
DirectX usa un sistema zurdo donde la parte + Z de la coordenada mundial se extiende hacia la pantalla, lejos del espectador.
Nunca utilicé la API Glide , así que no sé cómo funcionó, pero por lo que puedo deducir, también usa un sistema zurdo.
¿Hay alguna razón técnica para esto? Y si no es así, ¿hay alguna ventaja conceptual en una mano particular de un sistema de coordenadas? ¿Por qué uno elegiría uno sobre el otro?
Respuestas:
Sé que esta es una publicación antigua, pero vi que se hace referencia a esta publicación y no me gusta el tono de la respuesta elegida.
¡Así que hice un poco de investigación!
A partir de esto, puedo especular sobre un par de cosas:
Por lo tanto, mi conclusión sería:
Cuando tuvieron que elegir, no sabían del estándar, eligieron el 'otro' sistema, y todos los demás simplemente siguieron el viaje. No es un negocio sospechoso, solo una desafortunada decisión de diseño que se llevó a cabo porque la compatibilidad con versiones anteriores es el nombre del juego de Microsoft.
fuente
Me sorprende que nadie haya mencionado algo: OpenGL también funciona en un sistema de coordenadas zurdo. Al menos, lo hace cuando trabaja con sombreadores y usa el rango de profundidad predeterminado.
Una vez que descarta la canalización de función fija, trata directamente con "clip-space". La especificación OpenGL define el espacio de clip como un sistema de coordenadas homogéneo 4D. Cuando sigue las transformaciones a través de coordenadas de dispositivo normalizadas, y baja al espacio de la ventana, 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 hacia arriba y + X hacia 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 . Entonces el + Z se aleja del espectador.
Ese es un sistema de coordenadas zurdo. Sí, puede cambiar la prueba de profundidad de GL_LESS a GL_GREATER y cambiar glDepthRange 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 tanto, el espacio de clip, la salida del sombreador de vértice (o geometría) es un espacio para zurdos (un poco. Es un espacio homogéneo 4D, así que es difícil precisar la mano).
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 . Cambian el significado de Z; solo verifique las matrices que generan. En el espacio para los ojos, + Z se mueve hacia el espectador; en el espacio posterior a la proyección, se aleja.
Sospecho que Microsoft (y GLide) simplemente no se molestó en realizar la negación en sus matrices de proyección.
fuente
Es pura historia. En la antigüedad, los primeros programadores de gráficos de cuevas pensaban que la superficie de visualización del monitor (teletipo? Tipo de piedra?) Era un papel cuadriculado bidimensional. En matemáticas e ingeniería, las convenciones usuales para trazar puntos de datos en papel cuadriculado son: x = derecha, y = arriba. Entonces, un día, aproximadamente una semana después de la invención de la rueda de silicio, alguien pensó en gráficos en 3D. Cuando el foco de esta idea parpadeaba sobre su cabeza, por cualquier razón, eligen agregar Z = lejos del espectador. (Ay, me duele la mano derecha solo de imaginar eso.)
No tenían idea de que algún día sus descendientes lejanos se convertirían en ingenieros, científicos, artistas, artistas comerciales, animadores, diseñadores de productos, etc. y encontrarían útiles los gráficos 3D. Todas estas buenas personas modernas utilizan sistemas de coordenadas diestros para ser coherentes entre sí y con los textos matemáticos y las convenciones de física más establecidos.
Es una tontería basar el sistema de coordenadas 3D en la superficie de la pantalla. Es el modelo lo que cuenta: los triángulos, los polígonos y los planos que describen una casa, una silla, un ogro verde con sobrepeso o una galaxia. Hoy en día todos diseñamos y modelamos cosas en sistemas XYZ diestros, y lo hacemos en términos del mundo del modelo, incluso antes de pensar cómo se representará. La cámara se agrega en algún momento, posiblemente hecha para volar de manera loca, y es una infraestructura invisible que convierte el modelo en píxeles que dentro de sus intestinos deben moverse con transformaciones coordinadas del sistema.
Solo para aumentar la confusión, algunas bibliotecas de gráficos reconocen que los CRT escanean la imagen de arriba a abajo, y también tienen Y = abajo. Esto se usa incluso hoy en todos los sistemas de ventanas y administradores de ventanas: X11, fvwm, gtk +, Win31 API, etc. La forma en que los nuevos sistemas GUI 3D como Clutter, Beryl, etc. tratan con Z, es un problema separado del modelado de gráficos 3D. Esta necesidad solo concierne a programadores de aplicaciones y diseñadores de GUI.
fuente
Ambos son esencialmente equivalentes, ya que uno se puede transformar fácilmente en el otro. La única ventaja que puedo encontrar para el sistema zurdo es: como los objetos están más lejos del observador, en cualquier dirección (x, y, o z), la distancia es un valor más alto. Pero no tengo idea si es por eso que Microsoft eligió uno sobre el otro.
POV-Ray también usa un sistema de corrida zurdo.
fuente
El desarrollador principal de DirectX (y Direct3D) Alex St. John comentó recientemente sobre eso. En un artículo sobre la historia de Direct3D, escribió:
Fuente: http://www.alexstjohn.com/WP/2013/07/22/the-evolution-of-direct3d/
fuente
Lo que hay que entender es que se ha desperdiciado una ENORME cantidad de tiempo del programador convirtiendo entre sistemas de coordenadas zurdos y diestros, e incluso se ha desperdiciado aún más tiempo del programador recordando qué sistema se necesitaba en un instante en particular.
Todo eso desapareció cuando los sistemas de coordenadas diestros se convirtieron en el estándar de la industria.
Ya hay suficientes sistemas de coordenadas de uso común, sin duplicar el número al introducir una pregunta de mano. Ver Minkler y Minkler, "Transformaciones y sistemas de coordenadas aeroespaciales" . Si está en el negocio de coordenadas aeroespaciales, por ejemplo, haciendo simulación de vuelo, NECESITA ese libro.
Mi conjetura es que Microsoft no tenía a NADIE en el proyecto DirectX que supiera algo sobre los estándares de la industria, no se dio cuenta de que había un estándar de la industria y pensó que no importaba.
La otra posibilidad, que sabían que los sistemas diestros eran el estándar de la industria, y deliberadamente hicieron DirectX para zurdos, para que sea DURO que las personas conviertan el código que usó DirectX para usar OpenGL, no tiene en cuenta. Si descubriera que este es realmente el caso, me resultaría necesario embarcarme en una carrera nueva y presumiblemente efímera como asesino de hachas en Redmond.
fuente
Para todos aquellos que piensan que no hay ventaja para los diestros o zurdos, estás absolutamente equivocado. La diestra de los sistemas de coordenadas cartesianas proviene de la definición del producto vectorial cruzado. Para vectores de la base de XYZ
u
,v
yw
,w = u X v
.Esta definición es fundamental para las matemáticas vectoriales, el cálculo vectorial y gran parte de la física. Suponga que está tratando de simular interacciones electromagnéticas. Tiene un vector de campo magnético
M
, y una partícula cargada que se mueve en ese campo con velocidadv
. ¿De qué manera se acelera la carga? Fácil - en la dirección deM X v
. Excepto que un idiota pensó que sería divertido hacer que su sistema de visualización sea zurdo, por lo que acelera en la dirección de-M X v
.Básicamente, cualquier interacción física entre dos cantidades de vectores se define como diestra, por lo que cada vez que necesite simular esa interacción, es mejor que espere que su sistema de gráficos sea diestro o tendrá que recordar cargar con signos negativos en todas tus matemáticas
fuente
0,0,1
adelante y eso es zurdo, así que1,0,0 X 0,1,0
make0,0,1
es zurdoM X v
peroM
se considera que el campo magnético apunta en la dirección opuesta porque es un pseudovector. Puede usar las mismas ecuaciones en cualquier sistema: lo único que cambia es su interpretación de la forma en que los pseudovectores "apuntan". Los vectores adecuados, como la aceleración, siempre funcionarán igual en cualquier sistema de coordenadas. en.wikipedia.org/wiki/Pseudovector#The_right-hand_ruleLa verdadera respuesta a la zurda temprana de Direct3D es mucho menos siniestra de lo que algunos de ustedes especulan. DirectX comenzó cuando Microsoft compró RenderMorphics en 1995.
En ese momento, el texto gráfico estándar utilizado en las oficinas de RenderMorphics era "Principios de gráficos de computadora interactivos" de Newmann y Sproul, que hace todo con coordenadas para zurdos. Es el mismo libro que usé en la universidad. Mirando el código D3D, incluso podría verlos usando nombres de variables que coinciden con las ecuaciones del libro.
No es una conspiración de Microsoft. La decisión se tomó antes de que Microsoft entrara en escena.
fuente
En última instancia, ninguno de los dos es mejor que el otro: está asignando coordenadas 3D a una superficie 2D, por lo que la tercera dimensión (que realmente hace que las cosas sean 3D) se puede elegir arbitrariamente, apuntando al espectador o a la pantalla. De todos modos, va a poner las cosas en una matriz 4x4, por lo que no hay ninguna razón técnica para elegir una sobre la otra. Funcionalmente, se podría argumentar:
Conclusión : Existe cierto consenso para el eje X, pero para las otras dos, se puede argumentar por ambas direcciones, produciendo dos configuraciones para diestros y dos para zurdos, y todas tienen sentido.
fuente
Dato interesante.
Direct3D (no DirectX: DirectX también cubre la entrada, el sonido, etc.) en realidad no tiene un sistema de coordenadas para zurdos.
Es perfectamente capaz de soportar sistemas RH y LH. Si busca en la documentación del SDK, verá funciones como D3DXMatrixPerspectiveFovLH y D3DXMatrixPerspectiveFovRH. Ambos funcionan y ambos producen una matriz de proyección que se puede utilizar con éxito con su sistema de coordenadas de elección. Demonios, incluso puedes usar column-major en Direct3D si lo deseas; es solo una biblioteca de matriz de software y no es necesario que la use. Por otro lado, si desea usarlo con OpenGL, encontrará que también funciona perfectamente bien con OpenGL (que es quizás la prueba definitiva de la independencia de la biblioteca matricial de Direct3D).
Entonces, si desea utilizar un sistema RH en su programa, simplemente use la versión -RH de la función. Si desea usar un sistema LH, use la versión -LH. A Direct3D no le importa. Del mismo modo, si desea utilizar un sistema LH en OpenGL, simplemente glLoadMatrix una matriz de proyección LH. Ninguna de estas cosas es importante y no está cerca del gran problema que a veces se ve hecho.
fuente
No hay ventaja técnica para ninguna de las manos, es completamente arbitrario. Ambos funcionan bien siempre y cuando seas consistente.
Debido a las ventajas de la consistencia, idealmente uno debería simplemente "usar lo que todos los demás están usando", pero eso es bastante difícil en muchos casos, porque tampoco existe una convención abrumadoramente "preferida" en la práctica: ambas manos son ampliamente utilizadas. En el mejor de los casos, hay cierta coherencia dentro de ciertas comunidades (por ejemplo, OpenGL).
Así que creo que la respuesta básica a esta pregunta es: eligieron lo que eligieron porque se sentía bien (sin duda tenían alguna experiencia previa con esa mano) y había pocas razones para no hacerlo.
Al final, hace poca diferencia: cualquiera que quiera seriamente intercambiar activos / código con otros sistemas / comunidades tendrá que estar preparado para lidiar con la conversión de la mano de todos modos, porque es una realidad en los gráficos 3D.
fuente
Proporcionando esto como material complementario a mi respuesta anterior aquí. De una vieja especificación de OpenGL de la década de 1990:
(fuente: http://www.opengl.org/documentation/specs/version1.2/opengl1.2.1.pdf ).
Entonces, dado que ni D3D ni OpenGL imponen ninguna mano, la verdadera pregunta es: ¿por qué la gente ve esto como algo importante?
fuente
Odio decírtelo, pero la 'mano' de un conjunto de coordenadas es realmente subjetiva: depende de la forma en que imaginas que estás mirando las cosas. Un ejemplo, de la especificación del mapa de cubos OpenGL: si imagina estar dentro del cubo mirando hacia afuera, el sistema de coordenadas es zurdo, si piensa en mirar desde afuera es diestro. Este simple hecho causa un dolor infinito, porque para obtener una respuesta numéricamente correcta todas sus suposiciones tienen que ser consistentes, aunque localmente no importa qué suposición haga.
La especificación OpenGL es oficialmente "neutralidad en la entrega" y hace todo lo posible para evitar este problema, es decir, posponerlo en el programador. Sin embargo, hay un "cambio de mano" entre las coordenadas del ojo y las coordenadas del clip: en el modelo y el espacio del ojo que estamos viendo, en el espacio del clip y del dispositivo estamos mirando. Siempre estoy luchando con las consecuencias de esta complicación accidental, sin duda.
El producto cruzado es nuestro amigo, porque le permite generar un sistema de coordenadas 3D definitivamente diestro o zurdo a partir de un par de vectores. Pero de qué mano depende depende de cuál de esos vectores llame "X".
fuente
Podría decir que el estándar de la industria está mal desde el principio
El estándar de coordenadas de la industria en realidad provino de las coordenadas de escritorio, cuando las personas dibujan todo en el escritorio, que es un plano horizontal. X es izquierda / derecha e Y es adelante / atrás, por lo que solo hace que Z esté hacia arriba y así nació el Sistema de coordenadas para diestros
Pero ya sabes, ahora lo estamos usando con la pantalla del monitor. Es plano vertical. X sigue siendo izquierda / derecha pero Y es arriba y abajo
Entonces, ¿qué causaría el Sistema de coordenadas diestro? Hace que + Z sea hacia atrás y -Z hacia adelante ¿Qué demonios es esto? Arriba es + y Abajo es - Derecha es + e Izquierda es - PERO Adelante es - y Atrás es + ??? Es muy estúpido si hacemos que el personaje del juego se ejecute en el mundo 3D, pero necesitamos menos z para seguir adelante. Es por eso que el programador de juegos aprecia más DirectX
Tomar un estándar que vino del escritorio y usarlo en el monitor es tan incorrecto en muchos niveles desde el primer lugar. Y ahora deberíamos admitir que ellos, OpenGL e Industry, están equivocados. Simplemente usan lo que piensan que los haría sentir cómodos, pero están equivocados y el Sistema de coordenadas para diestros es solo un legado basura que debe desecharse lo más rápido posible
fuente