J'ai envisagé de poster sur Stack Overflow, mais la question me semble beaucoup trop subjective, car je ne vois pas d'explication technique raisonnable au choix de Microsoft dans cette affaire. Mais cette question me trouble depuis si longtemps et la question continue de surgir dans l'un de mes projets, et je n'ai jamais vraiment vu une tentative d'expliquer ceci:
OpenGL utilise un système de coordonnées à droite, dans lequel la partie + Z du système de coordonnées mondial s'étend vers le spectateur.
DirectX utilise un système pour gaucher où la partie + Z de la coordonnée mondiale s'étend dans l'écran, loin du spectateur.
Je n'ai jamais utilisé l' API Glide , donc je ne sais pas comment cela a fonctionné, mais d'après ce que je peux en déduire, elle utilise également un système pour gaucher.
Y a-t-il une raison technique à cela? Et si non, y a-t-il un avantage conceptuel à la spécificité d'un système de coordonnées? Pourquoi l’un choisirait-il l’un sur l’autre?
Réponses:
Je sais que c'est un ancien message, mais j'ai vu ce message être référencé et je n'aime pas le ton de la réponse choisie.
Alors j'ai fait un peu d'enquête!
À partir de là, je peux spéculer sur deux choses:
Par conséquent, ma conclusion serait:
Quand ils ont dû choisir, ils ne connaissaient pas la norme, ils ont choisi l’autre système et tous les autres se sont contentés. Aucune affaire douteuse, juste une décision de conception malheureuse qui a été prise car la compatibilité en amont est le nom du jeu de Microsoft.
la source
Je suis surpris que personne n'ait mentionné quelque chose: OpenGL fonctionne également dans un système de coordonnées gaucher. Au moins, c'est le cas lorsque vous utilisez des shaders et que vous utilisez la plage de profondeur par défaut.
Une fois que vous jetez le pipeline à fonction fixe, vous vous occupez directement de "clip-space". La spécification OpenGL définit l'espace de clip comme un système de coordonnées homogène 4D. Lorsque vous suivez les transformations par le biais des coordonnées normalisées de l’appareil et jusqu’à l’espace fenêtre, vous le trouvez.
L'espace fenêtre est dans l'espace des pixels d'une fenêtre. L'origine est dans le coin inférieur gauche, avec + Y en haut et + X en allant à droite. Cela ressemble beaucoup à un système de coordonnées droitier. Mais qu'en est-il de Z?
La plage de profondeur par défaut (glDepthRange) définit la valeur proche de Z sur 0 et la valeur extrême Z sur un . Donc, le + Z s’éloigne du spectateur.
C'est un système de coordonnées gaucher. Oui, vous pouvez modifier le test de profondeur de GL_LESS à GL_GREATER et modifier la valeur glDepthRange de [0, 1] à [1, 0]. Mais l' état par défaut d'OpenGL est de fonctionner dans un système de coordonnées gaucher . Et aucune des transformations nécessaires pour accéder à l’espace de la fenêtre à partir de l’espace clip-space n’annule le Z. Donc, espace-clip, le rendu du shader de sommet (ou de géométrie) est un espace gaucher (un peu. C’est un espace homogène 4D, donc il est difficile de cerner le côté droit).
Dans le pipeline à fonction fixe, les matrices de projection standard (produites par glOrtho, glFrustum, etc.) se transforment toutes d'un espace droitier à un espace gaucher . Ils retournent la signification de Z; il suffit de vérifier les matrices qu'ils génèrent. Dans l’œil, + Z se dirige vers le spectateur; dans l'espace post-projection, il s'éloigne.
Je soupçonne que Microsoft (et GLide) n’ont tout simplement pas pris la peine d’effectuer la négation dans leurs matrices de projection.
la source
C'est de l'histoire pure. Dans les temps anciens, les premiers programmeurs de graphismes de grottes considéraient la surface de visualisation du moniteur (télétype? Type de pierre?) Sous forme de papier graphique à deux dimensions. En mathématiques et en génie, les conventions habituelles pour tracer des points de données sur du papier millimétré sont les suivantes: x = droite, y = haut. Puis un jour, environ une semaine après l'invention de la roue de silicium, quelqu'un a pensé au graphisme 3D. Quand le bulbe de cette idée a clignoté au-dessus de leur tête, pour une raison quelconque, ils ont choisi d’ajouter Z = loin du spectateur. (Ouch, ma main droite me fait mal juste imaginer que.)
Ils ne savaient pas qu'un jour leurs lointains descendants deviendraient des ingénieurs, des scientifiques, des artistes de talent, des artistes commerciaux, des animateurs, des concepteurs de produits, etc. et trouveraient les graphiques 3D utiles. Tous ces gens modernes utilisent des systèmes de coordonnées à droite pour rester cohérents les uns avec les autres et avec les conventions mathématiques et physiques bien établies.
Il est insensé de baser le système de coordonnées 3D sur la surface d'affichage. C'est le modèle qui compte - les triangles, les polygones et les plans décrivant une maison, une chaise, un ogre vert en surpoids ou une galaxie. De nos jours, nous concevons et modélisons des éléments dans des systèmes XYZ pour droitiers, et nous le faisons en termes du monde du modèle, avant même de penser à la manière dont il sera rendu. La caméra est ajoutée à un moment donné, peut-être conçue pour voler de manière folle, et c'est une infrastructure invisible qui convertit le modèle en pixels qui, dans ses entrailles, doivent fonctionner avec des transformations de système coordonnées.
Juste pour ajouter à la confusion, certaines bibliothèques graphiques reconnaissent que les tubes cathodiques numérisent l'image de haut en bas, de même que Y = bas. Cela est encore utilisé aujourd'hui dans tous les systèmes de fenêtrage et les gestionnaires de fenêtres - X11, fvwm, gtk +, API Win31, etc. Comment les nouveaux systèmes d'interface graphique 3D tels que Clutter, Beryl, etc. sont un problème distinct de la modélisation graphique 3D. Cela doit concerner uniquement les programmeurs d'applications et les concepteurs d'interface graphique.
la source
Ils sont tous deux essentiellement équivalents, l'un pouvant être facilement transformé en un autre. Le seul avantage que je puisse trouver pour le système gaucher est le suivant: comme les objets sont plus éloignés de l'observateur, dans n'importe quelle direction (x, y ou z), la distance est plus grande. Mais je ne sais pas si c'est pourquoi Microsoft a choisi l'un plutôt que l'autre.
POV-Ray utilise également un système de couloir pour gaucher.
la source
Le développeur principal de DirectX (et Direct3D), Alex St. John, a récemment commenté cela. Dans un article sur l'histoire de Direct3D, il écrit:
Source: http://www.alexstjohn.com/WP/2013/07/22/the-evolution-of-direct3d/
la source
Ce qu’il faut comprendre, c’est qu’une énorme quantité de temps de programmation a été perdue lors de la conversion entre les systèmes de coordonnées gaucher et droitier, et encore plus de temps de programmation a été perdue pour rappeler quel système était nécessaire à un moment donné.
Tout cela a disparu lorsque les systèmes de coordonnées droitiers sont devenus la norme de l'industrie.
Il existe déjà suffisamment de systèmes de coordonnées couramment utilisés, sans doubler le nombre en introduisant une question de type «handness». Voir Minkler & Minkler, "Systèmes de coordonnées aérospatiales et transformations" . Si vous travaillez dans le secteur des coordonnées aérospatiales, par exemple lors d’une simulation de vol, vous avez BESOIN de ce livre.
J'imagine que Microsoft, dans le projet DirectX, n'avait AUCUNE PERSONNE qui soit au courant des normes de l'industrie, ne se soit pas rendu compte qu'il existait une norme de l'industrie et a estimé que cela importait peu.
L’autre possibilité, selon laquelle ils savaient que les systèmes à main droite étaient la norme de l’industrie, et ils ont délibérément passé DirectX à main gauche, de manière à rendre difficile la conversion du code qui utilisait DirectX pour utiliser OpenGL, n’est pas prise en compte. Si je découvrais que tel était bien le cas, je trouverais nécessaire de se lancer dans une nouvelle et supposée carrière de meurtrier à Redmond.
la source
Pour tous ceux qui pensent que la main droite ou la main gauche n’ont aucun avantage, vous avez absolument tort. Le caractère droit des systèmes de coordonnées cartésiennes provient de la définition du produit vectoriel. Pour les vecteurs de base XYZ
u
,v
etw
,w = u X v
.Cette définition est fondamentale pour les mathématiques vectorielles, le calcul vectoriel et une grande partie de la physique. Supposons que vous essayez de simuler des interactions électromagnétiques. Vous avez un vecteur de champ magnétique
M
et une particule chargée se déplaçant dans ce champ avec la vitessev
. De quelle manière la charge s'accélère-t-elle? Facile - dans le sens deM X v
. Sauf qu'un idiot a pensé que ce serait amusant de rendre votre système d’affichage gaucher, pour qu’il accélère dans la direction de-M X v
.Fondamentalement, toute interaction physique entre deux quantités vectorielles est définie comme un droitier. Par conséquent, chaque fois que vous avez besoin de simuler cette interaction, il est préférable d'espérer que votre système graphique le soit pour le droitier ou que vous deviez vous rappeler de contourner les signes négatifs. tous tes calculs.
la source
0,0,1
aller de l'avant et c'est à gauche alors1,0,0 X 0,1,0
make0,0,1
est à gaucheM X v
maisM
on considère que le champ magnétique pointe dans la direction opposée car il s'agit d'un pseudovecteur. Vous pouvez utiliser les mêmes équations dans l'un ou l'autre système: la seule chose qui change est votre interprétation de la manière dont les pseudovecteurs "pointent". Les vecteurs appropriés tels que l'accélération fonctionneront toujours de la même manière dans les deux systèmes de coordonnées. fr.wikipedia.org/wiki/Pseudovector#The_right-hand_ruleLa vraie réponse à la gauche précoce de Direct3D est beaucoup moins sinistre que certains ne le spéculent. DirectX a fait ses débuts lorsque Microsoft a acheté RenderMorphics en 1995.
A cette époque, le texte graphique standard utilisé dans les bureaux de RenderMorphics était "Principles of Interactive Computer Graphics" de Newmann et Sproul, qui fait tout en utilisant les coordonnées gaucher. C'est le même livre que j'ai utilisé au collège. En regardant le code D3D, vous pourriez même les voir en utilisant des noms de variables qui correspondent aux équations du livre.
Ce n'est pas une conspiration de Microsoft. La décision a été prise avant même que Microsoft entre en scène.
la source
En fin de compte, ni l’un ni l’autre n’est meilleur; vous mappez des coordonnées 3D sur une surface 2D. La troisième dimension (qui fait réellement la 3D) peut être choisie de manière arbitraire, en pointant vers le spectateur ou vers l’écran. De toute façon, vous allez passer à travers une matrice 4x4, il n’ya donc aucune raison technique de choisir l’une sur l’autre. Fonctionnellement, on pourrait dire:
Conclusion : Il y a un certain consensus pour l'axe des X, mais pour les deux autres, les deux directions peuvent être argumentées, donnant deux configurations pour droitier et deux pour gaucher, et elles ont toutes un sens.
la source
Fait intéressant.
Direct3D (pas DirectX - DirectX couvre également les entrées, le son, etc.) n’a pas de système de coordonnées pour la main gauche.
Il est parfaitement capable de prendre en charge les systèmes RH et LH. Si vous consultez la documentation du SDK, vous verrez des fonctions telles que D3DXMatrixPerspectiveFovLH et D3DXMatrixPerspectiveFovRH. Les deux fonctionnent et produisent une matrice de projection qui peut être utilisée avec succès avec le système de coordonnées de votre choix. Enfer, vous pouvez même utiliser colonne-majeur dans Direct3D si vous le souhaitez; c'est juste une bibliothèque de matrices de logiciels et vous n'êtes pas obligé de les utiliser. D'autre part, si vous souhaitez l'utiliser avec OpenGL, vous constaterez qu'il fonctionne également parfaitement avec OpenGL (ce qui est peut-être la preuve définitive de l'indépendance de la bibliothèque matricielle par rapport à Direct3D lui-même).
Donc, si vous voulez utiliser un système RH dans votre programme, utilisez simplement la version -RH de la fonction. Si vous souhaitez utiliser un système LH, utilisez la version -LH. Direct3D s'en fiche. De même, si vous souhaitez utiliser un système LH dans OpenGL, utilisez simplement glLoadMatrix une matrice de projection LH. Aucune de ces choses n’est importante et c’est loin de l’énorme problème que vous voyez parfois.
la source
Il n’ya aucun avantage technique à l’un ou l’autre main, c’est complètement arbitraire. Les deux fonctionnent bien tant que vous êtes cohérent.
En raison des avantages de la cohérence, idéalement, on devrait simplement "utiliser ce que tout le monde utilise" - mais c'est assez difficile dans de nombreux cas, car il n'y a pas non plus de convention "privilégiée" dans la pratique: les deux mains sont largement utilisées. Au mieux, il existe une certaine cohérence au sein de certaines communautés (par exemple, OpenGL).
Donc, je pense que la réponse fondamentale à cette question est la suivante: ils ont choisi ce qu'ils choisissaient parce que cela leur semblait juste (ils avaient sans doute une expérience antérieure de cette technique) et il y avait peu de raisons de ne pas le faire.
En fin de compte, cela ne fait guère de différence: quiconque souhaite sérieusement échanger des actifs / du code avec d'autres systèmes / communautés doit être préparé de toute façon à gérer la conversion manuelle, car c'est une réalité de la vie en 3D.
la source
En fournissant cela comme matériel supplémentaire à ma réponse précédente ici. D'une ancienne spécification OpenGL des années 1990:
(source: http://www.opengl.org/documentation/specs/version1.2/opengl1.2.1.pdf ).
Donc, puisque ni D3D ni OpenGL n’appliquent la moindre justice, la vraie question est: pourquoi les gens voient-ils cela comme un gros problème?
la source
Je n'aime pas vous dire, mais la «main» d'un ensemble de coordonnées est en réalité subjective - cela dépend de la façon dont vous imaginez regarder les choses. Un exemple, tiré de la spécification de cube OpenGL: si vous imaginez être à l'intérieur du cube, le système de coordonnées est gaucher, si vous envisagez de regarder de l'extérieur, il est droitier. Ce simple fait est source de chagrin sans fin, car pour obtenir une réponse numériquement correcte, toutes vos hypothèses doivent être cohérentes, même si, localement, le choix de votre hypothèse importe peu.
La spécification OpenGL est officiellement "neutre" et s'efforce d'éviter ce problème, c'est-à-dire de la remettre au programmeur. Cependant, il existe un "changement de main" entre les coordonnées de l’œil et celles du clip: dans l’espace modèle et oeil dans lequel nous cherchons, dans l’espace pour les clips et les appareils, nous cherchons. Je suis toujours aux prises avec les conséquences de cette complication accidentelle sans doute.
Notre produit est notre ami car il vous permet de générer un système de coordonnées 3D parfaitement droitier ou gaucher à partir d'une paire de vecteurs. Mais de quelle main il s'agit dépend de celui de ces vecteurs que vous appelez "X".
la source
Je pourrais dire que la norme de l'industrie est fausse dès le départ
La norme de l'industrie en matière de coordonnées est en réalité issue de la coordonnée de bureau, lorsque les utilisateurs dessinent tout sur un bureau, plan horizontal. X est à gauche / à droite et Y est à l'avant / à l'arrière, il faut donc que Z soit en haut et que le système de coordonnées de droite est né
Mais vous savez que nous utilisons maintenant avec l’écran de contrôle C’est un plan vertical. X est toujours à gauche / droite mais Y est le haut et le bas à la place
Alors, quel système de coordonnées pour droitier causerait? Il fait + Z être en arrière et -Z être en avant Qu'est-ce que c'est? Haut est + et Bas est - Droite est + et Gauche est - MAIS en avant est - et en arrière est + ??? C’est tellement bête de faire jouer ce personnage dans un monde en 3D, mais il faut moins z pour avancer. C'est pourquoi les programmeurs de jeux apprécient le plus DirectX
Saisir une norme qui venait du bureau et l’utiliser sur un moniteur est une erreur à plusieurs niveaux dès le départ. Et maintenant, nous devrions admettre qu’ils, OpenGL et Industry, ont tort. Ils utilisent simplement ce qu'ils pensent que cela les mettrait à l'aise, mais ils se trompent et le système de coordonnées de droite est simplement un héritage indésirable qui doit être jeté aussi vite que possible.
la source