Je suis en train d'essayer de comprendre l'OpenGL système de coordonnées. Cependant, quelques tutoriels dire le système de coordonnées par défaut est remis à gauche (voir http://www.c-sharpcorner.com/UploadFile/jeradus/OpenGLBasics11172005014307AM/OpenGLBasics.aspx) et d'autres disent qu'il est droitier (voir http://www.falloutsoftware.com/tutorials/gl/gl0.htm). Ce qui est correct? Je comprends que l'on peut transformer l'un à l'autre par la mise en miroir mais je voudrais savoir les coordonnées par défaut.
Réponses
Trop de publicités?Il y a une confusion ici.
OpenGL est remis à droite dans l'espace objet et l'espace.
Mais en l'espace de fenêtre (alias d'espace à l'écran) d'un coup on gaucher.
Comment est-ce arrivé?
La façon dont nous obtenons à partir de droitier à gaucher est un z négatif de mise à l'échelle entrée dans l' glOrtho
ou glFrustum
matrices de projection. Mise à l'échelle z par -1 (tout en laissant x et y comme ils l'étaient) a pour effet de changer l'impartialité du système de coordonnées.
Pour glFrustum,
de loin et de près , sont censés être positive, avec beaucoup > près de. Dire loin=1000 et près de=1. Alors La C= -( 1001 ) / ( 999 ) = -1.002.
Voir ici pour plus de détails et des diagrammes.
À partir d'un point de vue orthographique, glOrtho génère une matrice comme ceci:
Ici, gauche, droite, bas et haut sont juste les coordonnées verticales de gauche, de droite verticale, horizontale inférieure, supérieure horizontale plans de découpe (reee).
Le près et le loin les avions, cependant, sont spécifiées de manière différente. La proximité paramètre est défini comme
- À proximité: La distance à la plus proche de profondeur plan de découpe. Cette distance est négative si l'avion est à l'origine du spectateur.
et de loin:
- zFar La distance à la plus loin de la profondeur de plan de découpe. Cette distance est négative si l'avion est à l'origine du spectateur.
Ici, nous avons un typique canonique de vue du volume
Parce que le z multiplicateur est (-2/(loin-près)), le signe moins efficacement échelles z par -1. Cela signifie que le "z" est tourné à gauche, remis lors de la transformation de visualisation, à l'insu de la plupart des gens, car ils travaillent tout simplement en OpenGL comme un "droitier" système de coordonnées.
Donc, si vous appelez
glOrthof(-1, 1, -1, 1, 10, -10) ; // near=10, FAR=-10,
Ensuite, le PLAN est de 10 unités d'avance sur vous. Où êtes-vous? Pourquoi, à l'origine, avec l'axe des x vers la droite, l'axe y sur le dessus de votre tête, et votre nez vers le bas le négatif de l'axe z (qui est la valeur par défaut "Par défaut, la caméra est située à l'origine, les points négatifs de l'axe z, et a un vecteur de (0, 1, 0)."). Donc, le plan est à z=-10. Le présent plan est de 10 unités derrière vous, à z=+10.
Par défaut, l'Appareil Normalisé de Coordonnées est gaucher.
Le glDepthRange est par défaut [0, 1] (de près, de loin) le +de l'axe z à l'écran et avec +x vers la droite et y +up c'est un gaucher système.
La modification de la profondeur de la gamme de [1, 0] et le système de la main droite.
Citant une précédente réponse de Nicol: (la grève est mon travail, expliqué ci-dessous)
Je suis surpris que personne n'a mentionné quelque chose: OpenGL fonctionne dans la main gauche système de coordonnées de trop. Au moins, il le fait lorsque vous travaillez avec des shaders et utiliser la valeur par défaut de profondeur.
Une fois que vous vous débarrassez de la fonction fixe pipeline, vous traitez directement avec "clip de l'espace". La Spécification OpenGL définit clip-de l'espace comme un 4D homogène du système de coordonnées. Lorsque vous suivez les transforme par le biais normalisé les coordonnées de périphérique, et en bas de la fenêtre de l'espace, vous trouver cela.
L'espace de fenêtre est en l'espace d'une fenêtre en pixels. L'origine est dans le coin inférieur gauche, avec +Y monter et +X la droite. Qui ressemble beaucoup à un système de coordonnées main droite. Mais qu'en Z?
La valeur par défaut de la profondeur de gamme (glDepthRange) définit la proximité de Z de la valeur à 0 et l'extrême valeur de Z pour une. Donc le +Z va loin de l'observateur.
C'est un gaucher système de coordonnées. Oui, vous pouvez
modifier le test de profondeur de GL_LESS à GL_GREATER etmodifier le glDepthRange de [0, 1], [1, 0]. Mais le défaut de l'état de l'OpenGL est de travailler dans un gaucher système de coordonnées. Et aucun de ces transformations est nécessaire pour accéder à la fenêtre de l'espace de clip-espace nier la Z. clip-espace, la sortie du vertex (ou géométrie) shader est un gaucher de l'espace (un peu. C'est un 4D espace homogène, de sorte qu'il est difficile de cerner la chiralité).Dans le fixe en fonction de pipeline, la norme matrices de projection (produit par glOrtho, glFrustum et similaires) tout transformer à partir d'une droite de l'espace pour un gaucher un. Ils renversent le sens de Z; il suffit de cocher les matrices qu'ils génèrent. Dans l'oeil de l'espace, +Z se déplace vers le spectateur; dans la après-espace de projection, il s'en éloigne.
Je soupçonne Microsoft (et de la Glisse) n'a tout simplement pas pris la peine d'effectuer la négation dans leurs matrices de projection.
J'ai fait une grève de la partie puisqu'il a divergé de mes conclusions.
Soit la modification de la DepthRange ou la DepthFunc et à l'aide de la ClearDepth(0) fonctionne, mais lorsque vous utilisez les deux ils annulent les uns les autres pour un gaucher système.
SEULEMENT NDC
Vous ne devriez remarquer que OpenGL only knows NDC!!
,et c'est un pas à gauche de la coordination.
peu importe ce que coordonnées que vous utilisez, de gauche,de droite de l'axe de coordonnées, etc.Tous doivent être mis en miroir à la SDN.
Si vous le souhaitez,vous pouvez tout à fait écrire de l'espace-monde à gauche-coordonner.
Pourquoi nous utilisons droite de droite de coordonnées dans l'espace-monde?
Je pense que c'est classique.Il n'a tout simplement.Peut-être qu'il faut faire la distinction entre de DirectX.
Le livre "WebGl Guide de Programmation" par Kouichi Matsuda passe près d'une dizaine de pages sur "WebGl/OpenGl: à Gauche ou à Droite?"
Selon le livre:
Dans la pratique, la plupart des gens utilisent un droitier système
OpenGl est en fait un gaucher système en interne
En interne, plus profondément, c'est en fait ni. Tout en bas OpenGl ne se soucient pas de la z-valeur. L'ordre dans lequel vous dessiner des choses détermine ce qui est dessiné sur le dessus (tracer un triangle d'abord, puis un quad, quad remplace le triangle).
Je ne suis pas entièrement d'accord avec le "c'est ni" mais c'est probablement une question philosophique, de toute façon.