2009-03-10 4 views
116

Je suis nouveau sur OpenGL et je suis un peu débordé par toutes les fonctions aléatoires que j'ai dans le code. Ils travaillent et je sais quand les utiliser, mais je ne sais pas pourquoi j'ai besoin d'eux ou ce qu'ils font réellement.Que fait glLoadIdentity() en OpenGL?

Je sais que 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 de fonctions dans mon code à moins que je sache ce qu'ils font. Je devrais noter que j'utilise OpenGL exclusivement pour les clients 2D riches donc excusez mon ignorance si c'est quelque chose de très évident pour la 3D.

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

Répondre

125

La matrice d'identité, en termes de matrices de projection et 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. 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 que vous appelez glLoadIdentity(), puis glTranslate à partir de la matrice qui se trouve à l'origine, ou glRotate à partir de 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 exactement correcte. La matrice ressemble à 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 avec cette matrice (ou une matrice qui ressemble à cela, les diagonales, tous les autres 0) aboutira à la matrice originale, mais je ne crois pas qu'il ait expliqué pourquoi cela est important.

La raison pour laquelle ceci est important est que OpenGL multiplie toutes les positions et rotations à travers chaque matrice; donc quand vous dessinez un polygone (glBegin(GL_FACE), quelques points, glEnd()), il le traduit en "espace du monde" en le multipliant avec MODELVIEW, puis le traduit de 3D en 2D en le multipliant avec la matrice PROJECT, et que lui donne les points 2D à l'écran, ainsi que la profondeur (à partir de l'écran 'caméra'), qu'il utilise pour dessiner des pixels. Mais quand l'une de ces matrices est la matrice d'identité, les points sont multipliés avec la matrice d'identité et par conséquent ne sont pas changés, ainsi la matrice n'a aucun effet; il ne traduit pas les points, il ne les fait pas tourner, il les laisse tels quels.J'espère que cela clarifie un peu plus!

+0

exemple clair avec moi :) – hqt

+1

Cela signifie, OpenGL maintient un « maître » ou matrice « Global » et, chaque matrice suivante est appliquée par rapport à celle « Maître » ou Matrice 'globale'. Ai-je raison? – anonymous

38

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

La même chose vaut pour la matrice (MatrixA x IdentityMatrix = MatrixA). Ainsi, le chargement d'une matrice d'identité est 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 de modèle. C'est-à-dire, de transformer votre objet (aka modèle) en espace de coordonnées de vue (ou espace de caméra).

2

La matrice d'identité est utilisée pour "initialiser" une matrice à un défaut par défaut. Une chose importante à réaliser est que les multiplications matricielles sont dans un sens additives. Par exemple, si vous prenez une matrice qui commence par la matrice d'identité, multipliez-la par une matrice de rotation, multipliez-la par une matrice d'échelle, vous vous retrouvez avec une matrice qui pivote et met à l'échelle les matrices multipliées.

5

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 loin. Donc, quand nous disons que nous avons mis 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. Si elles ne sont pas à l'intérieur du volume de 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. Comme pour la matrice modelview, elle est utilisée pour effectuer diverses transformations aux modèles (objets) dans votre monde. Comme ceci vous devez seulement définir votre objet une fois et alors le traduire ou le faire pivoter ou le mettre à l'échelle.

Vous utiliseriez la matrice de projection avant de dessiner les objets dans 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 changer votre matrice à mi-chemin du dessin de vos modèles si par exemple vous voulez dessiner une scène puis dessiner du texte (avec certaines méthodes vous pouvez travailler plus facilement en projection orthographique) puis revenir à la matrice modelview. En ce qui concerne le nom modelview, il s'agit de la dualité des transformations de modélisation et de visualisation. Si vous rapportez 5 unités à la caméra, ou si vous déplacez l'unité de 5 unités vers l'avant, c'est essentiellement la même chose.

espère avoir à faire la lumière