Que fait glLoadIdentity () dans OpenGL?


132

Je suis nouveau sur OpenGL et je suis un peu dépassé par toutes les fonctions aléatoires que j'ai dans mon code. Ils fonctionnent et je sais quand les utiliser, mais je ne sais pas pourquoi j'en ai besoin ni ce qu'ils font réellement.

Je sais que cela glLoadIdentity()remplace la matrice actuelle par la matrice d'identité, mais qu'est-ce que cela fait exactement? Si chaque programme l'exige, pourquoi la matrice d'identité n'est-elle pas par défaut, sauf indication contraire? Je n'aime pas avoir des fonctions dans mon code à moins de savoir ce qu'elles font. Je dois noter que j'utilise OpenGL exclusivement pour les clients 2D riches alors excusez mon ignorance si c'est quelque chose de très évident pour la 3D.

Aussi un peu confus au sujet glMatrixMode(GL_PROJECTION)VS glMatrixMode(GL_MODELVIEW).

Réponses:


139

La matrice d'identité, en termes de matrices de projection et de vue du modèle, réinitialise essentiellement la matrice à son état par défaut.

Comme vous le savez, espérons-le, glTranslateet glRotatesont toujours relatifs à l'état actuel de la matrice. Ainsi, par exemple, si vous appelez glTranslate, vous traduisez à partir de la «position» actuelle de la matrice, et non de l'origine. Mais si vous voulez recommencer à l'origine, c'est à ce moment-là que vous appelez glLoadIdentity(), puis vous pouvez à glTranslatepartir de la matrice qui se trouve maintenant à l'origine, ou glRotatede la matrice qui est maintenant orientée dans la direction par défaut.

Je pense que la réponse de Boon, que c'est l'équivalent de 1, n'est pas tout à fait correcte. La matrice ressemble en fait à ceci:

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

C'est la matrice d'identité. Boon a raison, mathématiquement, que toute matrice multipliée par cette matrice (ou une matrice qui ressemble à cela; diagonales, tous les autres 0) aboutira à la matrice d'origine, mais je ne crois pas qu'il ait expliqué pourquoi c'est important.

La raison pour laquelle c'est important est que OpenGL multiplie toutes les positions et rotations à travers chaque matrice; donc quand par exemple vous dessinez un polygone ( glBegin(GL_FACE), quelques points, glEnd()), il le traduit en "espace monde" en le multipliant avec le MODELVIEW, puis le traduit de 3D en 2D en le multipliant avec la matrice PROJECT, et cela le donne les points 2D sur l'écran, ainsi que la profondeur (à partir de l'écran «caméra»), qu'il utilise pour dessiner des pixels. Mais lorsque l'une de ces matrices est la matrice d'identité, les points sont multipliés avec la matrice d'identité et ne sont donc pas modifiés, donc la matrice n'a aucun effet; il ne traduit pas les points, il ne les fait pas pivoter, il les laisse tels quels.

J'espère que cela clarifie un peu plus!


1
Cela signifie qu'OpenGL maintient une matrice «principale» ou «globale» et que chaque matrice suivante est appliquée par rapport à cette matrice «principale» ou «globale». Ai-je raison?
user366312

41

La matrice d'identité est l'équivalent de 1 pour le nombre. Comme vous savez que tout nombre qui se multiplie par 1 est lui-même (e.g. A x 1 = A),

La même chose vaut pour la matrice ( MatrixA x IdentityMatrix = MatrixA).

Le chargement d'une matrice d'identité est donc un moyen d'initialiser votre matrice dans le bon état avant de multiplier d'autres matrices dans la pile de matrices.

glMatrixMode(GL_PROJECTION) : traite des matrices utilisées par transformation de perspective ou transformation orthogonale.

glMatrixMode(GL_MODELVIEW): traite des matrices utilisées par la transformation de vue modèle. Autrement dit, pour transformer votre objet (aka modèle) en espace de coordonnées de vue (ou espace de caméra).


6

La matrice de projection est utilisée pour créer votre volume de visualisation. Imaginez une scène dans le monde réel. Vous ne voyez pas vraiment tout autour de vous, seulement ce que vos yeux vous permettent de voir. Si vous êtes un poisson par exemple, vous voyez les choses un peu plus large. Donc, quand nous disons que nous mettons en place la matrice de projection, nous voulons dire que nous mettons en place ce que nous voulons voir de la scène que nous créons. Je veux dire que vous pouvez dessiner des objets n'importe où dans votre monde. S'ils ne sont pas dans le volume de vue, vous ne verrez rien. Lorsque vous créez le volume de vue, imaginez que vous créez 6 plans de détourage qui définissent votre champ de vision.

Quant à la matrice modelview, elle est utilisée pour effectuer diverses transformations des modèles (objets) de votre monde. De cette manière, vous n'avez qu'à définir votre objet une seule fois, puis à le traduire ou le faire pivoter ou le mettre à l'échelle.

Vous utiliseriez la matrice de projection avant de dessiner les objets de votre scène pour définir le volume de la vue. Ensuite, vous dessinez votre objet et modifiez la matrice de vue du modèle en conséquence. Bien sûr, vous pouvez modifier votre matrice à mi-chemin du dessin de vos modèles si, par exemple, vous souhaitez dessiner une scène, puis dessiner du texte (qui, avec certaines méthodes, vous pouvez travailler plus facilement en projection orthographique), puis revenir à la matrice de vue du modèle.

Quant au nom modelview, il a à voir avec la dualité de la modélisation et de la visualisation des transformations. Si vous dessinez la caméra de 5 unités en arrière ou si vous déplacez l'objet de 5 unités vers l'avant, c'est essentiellement la même chose.

J'espère que j'ai fait la lumière


2

La matrice d'identité est utilisée pour "initialiser" une matrice à une valeur par défaut raisonnable.

Une chose importante à réaliser est que les multiplications matricielles sont en un sens additives. Par exemple, si vous prenez une matrice qui commence par la matrice d'identité, multipliez-la par une matrice de rotation, puis multipliez-la par une matrice de mise à l'échelle, vous vous retrouvez avec une matrice qui tourne et met à l'échelle les matrices contre lesquelles elle est multipliée.


0

Juste pour récapituler ce que d'autres ont dit, la matrice d'identité est une matrice qui est telle que lorsque vous multipliez un vecteur / matrice avec elle, le résultat est ce même vecteur / matrice. C'est l'équivalent du nombre 1 avec multiplication ou du nombre 0 avec addition.

glLoadIdentity () est une fonction obsolète, et vous êtes encouragé à gérer vos propres matrices.


-1

glLoadIdentity() La fonction garantit que chaque fois que nous entrons dans le mode de projection, la matrice sera réinitialisée à la matrice d'identité, de sorte que les nouveaux paramètres de visualisation ne soient pas combinés avec le précédent.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.