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 travaillent et je sais quand les utiliser, mais je ne sais pas pourquoi j'ai besoin d'eux ni de ce qu'ils font réellement.
Je sais que glLoadIdentity()
remplace la matrice actuelle par la matrice d'identité, mais que fait-il exactement? Si chaque programme le requiert, pourquoi la matrice d’identité n’est-elle pas définie par défaut, sauf indication contraire? Je n'aime pas avoir de fonctions dans mon code, sauf si je sais ce qu'elles font. Je dois noter que j'utilise OpenGL exclusivement pour des clients 2D riches, alors excusez mon ignorance si ceci est très évident pour la 3D.
Aussi un peu confus à propos de glMatrixMode(GL_PROJECTION)
VS glMatrixMode(GL_MODELVIEW)
.
La matrice d'identité, en termes de matrices de projection et de vue de modèle, réinitialise essentiellement la matrice à son état par défaut.
Comme vous le savez, glTranslate
et glRotate
sont 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 alors que vous appelez glLoadIdentity()
, puis vous pouvez glTranslate
partir de la matrice qui se trouve maintenant à l’origine, ou glRotate
de la matrice qui est maintenant orientée dans la direction par défaut.
Je pense que la réponse de Boon, qui est l'équivalent de 1, n'est pas tout à fait correcte. La matrice ressemble en réalité à 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 ressemblant à celle-ci; diagonales, toutes les autres 0) aboutisse à la matrice d'origine, mais je ne crois pas qu'il a expliqué pourquoi c'est important.
Ceci est important car OpenGL multiplie toutes les positions et rotations de chaque matrice. Ainsi, lorsque, par exemple, vous tracez un polygone (glBegin(GL_FACE)
, quelques points, glEnd()
), il est converti en "espace mondial" en le multipliant avec le MODELVIEW, puis traduit de 3D en 2D. en le multipliant par la matrice PROJECT, ce qui lui donne les points 2D à l'écran, ainsi que la profondeur (à partir de la "caméra" à l'écran), qu'il utilise pour dessiner des pixels. Mais lorsqu'une de ces matrices est la matrice d'identité, les points sont multipliés par la matrice d'identité et ne sont donc pas modifiés. La matrice n'a donc 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!
La matrice d'identité est l'équivalent de 1 pour le nombre. Comme vous le savez, tout nombre qui 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é permet donc d’initialiser votre matrice à l’état approprié 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 modèle-vue. Autrement dit, pour transformer votre objet (modèle) dans l’espace de coordonnées de la vue (ou dans l’espace caméra).
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 larges. Ainsi, lorsque nous disons que nous établissons la matrice de projection, nous entendons ce que nous voulons voir à partir 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 la vue, vous ne verrez rien. Lorsque vous créez le volume de vue, imaginez que vous créez 6 plans de découpage qui définissent votre champ de vision.
Quant à la matrice modèle-vision, elle est utilisée pour effectuer diverses transformations sur les modèles (objets) de votre monde. De cette manière, il vous suffit de définir votre objet une fois, puis de le traduire, de le faire pivoter ou de le redimensionner.
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 modelview 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 dessinez du texte (qui, avec certaines méthodes, vous permet de travailler plus facilement en projection orthographique), puis revenez à la matrice modelview.
Quant au nom modelview, il concerne la dualité de la modélisation et de la visualisation des transformations. Si vous ramenez la caméra de 5 unités en arrière ou déplacez l’objet de 5 unités vers l’avant, c’est essentiellement la même chose.
J'espère avoir fait la lumière
La matrice d’identité est utilisée pour "initialiser" une matrice sur une valeur par défaut.
Une chose importante à réaliser est que les multiplications matricielles sont en quelque sorte 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 obtenez une matrice qui pivote et met à l'échelle les matrices contre lesquelles elle est multipliée.