web-dev-qa-db-fra.com

Le système de coordonnées OpenGL est-il gaucher ou droitier?

J'essaie de comprendre le système de coordonnées OpenGL. Cependant, certains tutoriels disent que le système de coordonnées par défaut est gaucher (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 ). Qui est correct? Je comprends que nous pouvons transformer l'un à l'autre en miroir mais je voudrais connaître les coordonnées par défaut.

82
341008

Il y a une certaine confusion ici.

enter image description here

OpenGL est droitier dans l'espace objet et l'espace monde.

Mais dans l'espace fenêtre (aka espace écran) nous sommes soudainement gaucher.

Comment est-ce arrivé ?

La façon dont nous passons de droitier à gaucher est une entrée d'échelle z négative dans les matrices de projection glOrtho ou glFrustum . La mise à l'échelle de z de -1 (tout en laissant x et y tels qu'ils étaient) a pour effet de changer la main du système de coordonnées.

Pour glFrustum,

enter image description hereenter image description here

loin et proche sont censés être positifs, avec loin> proche. Dites loin= 1000 et près= 1. Alors C = - (1001)/(999) = -1.002.

Voir ici pour plus de détails et de diagrammes.

D'un point de vue orthographique, glOrtho génère une matrice comme celle-ci:

enter image description here

Ici, à gauche, à droite, en bas et en haut sont juste les coordonnées pour vertical gauche, vertical droit, horizontal bas, horizontal haut = plans de détourage (resp) .

Les plans proches et éloignés , cependant, sont spécifiés différemment . Le paramètre near est défini comme

  • Proche: la distance au plan d'écrêtage le plus proche. Cette distance est négative si l'avion doit être derrière le spectateur.

et loin:

  • zFar La distance au plan d'écrêtage plus profond. Cette distance est négative si l'avion doit être derrière le spectateur.

Ici, nous avons un volume de vue canonique typique

canonical

Comme le multiplicateur z est (-2/(très proche)), le signe moins met effectivement z à l'échelle -1 . Cela signifie que "z" est tourné à gauche pendant la transformation de visualisation, à l'insu de la plupart des gens car ils travaillent simplement dans OpenGL comme une coordonnée "à droite" système.

Donc, si vous appelez

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

Ensuite, le PLAN PROCHE est 10 unités devant vous . Où es-tu? Pourquoi, à l'origine, avec l'axe des x à votre droite, l'axe des y au-dessus de votre tête et votre nez pointant vers le bas l'axe des z négatif (c'est la valeur par défaut "Par défaut, la caméra est située à l'origine, pointe vers le bas sur l'axe z négatif et a un vecteur ascendant de (0, 1, 0)." ). Le plan proche est donc à z = -10. Le plan éloigné est 10 unités derrière vous, à z = + 10 .

123
bobobobo

Par défaut, la coordonnée de l'appareil normalisé est gaucher.

Le glDepthRange est par défaut [0, 1] (près, loin) faisant pointer l'axe + z dans l'écran et avec + x vers la droite et + y vers le haut c'est un système pour gaucher.

Changer la plage de profondeur sur [1, 0] rendra le système droitier.

Citant un précédent réponse de Nicol : (le barré est mon travail, expliqué ci-dessous)

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 travaillez avec des shaders et utilisez la plage de profondeur par défaut.

Une fois que vous avez jeté le pipeline à fonction fixe, vous traitez directement avec "l'espace clip". 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 de coordonnées d'appareil normalisées, et jusqu'à l'espace fenêtre, vous trouvez cela.

L'espace de la fenêtre est dans l'espace des pixels d'une fenêtre. L'Origine est dans le coin inférieur gauche, avec + Y vers le haut et + X vers la 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 Z proche à 0 et la valeur Z extrême à un . Ainsi, le + Z s'éloigne du spectateur.

C'est un système de coordonnées pour gaucher. Oui, vous pouvez changer le test de profondeur de GL_LESS à GL_GREATER et changez le glDepthRange de [0, 1] à [1, 0]. Mais l'état par défaut d'OpenGL doit fonctionner dans un système de coordonnées gaucher. Et aucune des transformations nécessaires pour accéder à l'espace fenêtre à partir de l'espace clip n'annule le Z. Donc, l'espace clip, la sortie du vertex (ou de la géométrie) est un espace gaucher (un peu. C'est un espace homogène 4D, donc il est difficile de cerner la neutralité).

Dans le pipeline à fonction fixe, les matrices de projection standard (produites par glOrtho, glFrustum et similaires) se transforment toutes d'un espace droitier en un gaucher un. Ils inversent le sens de Z; il suffit de vérifier les matrices qu'ils génèrent. Dans l'espace des yeux, + Z se déplace vers le spectateur; dans l'espace de 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.

J'ai frappé une partie car elle s'écartait de mes conclusions.

Soit changer le DepthRange ou le DepthFunc et utiliser ClearDepth (0) fonctionne mais quand on utilise les deux ils s'annulent mutuellement vers un système gaucher.

24
hultqvist

SEULEMENT NDC

Vous devriez seulement remarquer que OpenGL only knows NDC!!, et c'est une coordonnée à gauche. peu importe la coordonnée que vous utilisez, les coordonnées d'axe gauche, droite, etc. Toutes doivent être reflétées dans NDC. Si vous le souhaitez, vous pouvez écrire totalement l'espace-monde en coordonnée gauche.

Pourquoi nous utilisons la coordonnée droite droite dans l'espace-monde?

Je pense que c'est conventionnel, c'est juste le cas, peut-être que je veux juste me distinguer de DirectX.

11
ZK_

Le livre "WebGl Programming Guide" de Kouichi Matsuda consacre près de dix pages à "WebGl/OpenGl: Left or Right Handed?"

Selon le livre:

  • En pratique, la plupart des gens utilisent un système pour droitiers

  • OpenGl est en fait un système pour gauchers en interne

  • En interne, plus profondément ce n'est en fait ni l'un ni l'autre. Tout en bas, OpenGl ne se soucie pas de la valeur z. L'ordre dans lequel vous dessinez les choses détermine ce qui est dessiné en haut (dessinez d'abord un triangle, puis un quad, le quad remplace le triangle).

Je ne suis pas entièrement d'accord avec le "ce n'est ni l'un ni l'autre" mais c'est probablement une question philosophique de toute façon.

7
Heinzlmaen

Opengl est définitivement gaucher. Vous voyez beaucoup de tutoriels indiquant le contraire car ils annulent la valeur z dans la matrice de projection. Lorsque les sommets finaux sont calculés à l'intérieur du vertex shader, il convertit les sommets que vous passez du côté client (coordonnée à droite) en gaucher, et les sommets seront ensuite passés au shader de géométrie et au shader de fragment. Si vous utilisez le système de coordonnées de droite côté client, Opengl s'en fiche. Il ne connaît que le système de coordonnées normalisées, qui est gaucher.

Edit: Si vous ne me faites pas confiance, expérimentez simplement votre vertex shader en ajoutant une matrice de traduction, et vous pouvez facilement voir si Opengl est gaucher ou non.

3
ForeignDevil