Ordre d'Opengl des transformations matricielles
Disons que j'ai un bleu 3D de la boîte (où la partie supérieure est de couleur rouge).
- Maintenant, je glScalef(1, 10, 1).
- Puis-je appeler glRotatef(90, 0, 1, 0).
- Puis-je rendre le cube.
Ce que j'attend c'est de voir le rouge côté face et s'étend vers l'écran (le long de l'axe Y de la le modèle).
Mais ce que je vois est ceci:
Le côté rouge est en face de l'écran (comme prévu).
Mais le tronçon est en cours sur l'axe des Y de la vue de l'espace (pas le modèle).
Je sais que si je l'échelle le long de l'axe Z, alors, je vais obtenir le bon résultat.
Mais ma confusion, c'est que j'ai pensé de mise à l'échelle sur l'axe des Y, puis en faisant tourner la boîte, me donnerait le bon résultat.
Ce qui me manque?
source d'informationauteur AlvinfromDiaspar | 2013-04-13
Vous devez vous connecter pour publier un commentaire.
OpenGL lit ses matrices dans ce qui est connu comme
colonne principale
afin. Le résultat est que chaque opération est un pré-multiplication de toutes les opérations avant elle, pas un post-multiplication. Ainsi, chaque appel ultérieur à un OpenGL opération (glScale, glTranslate, glRotate) est le première chose qui affecte un objet, et il va dans l'ordre inverse de la façon dont vous l'écrivez.Donc, vous avez besoin de changer votre multiplication ordre:
Pour dire la vérité, il se sent un peu moins intuitive lorsque vous écrivez des programmes et à l'aide d'un ordinateur d'avoir à préciser les choses dans l'ordre inverse. Mais les Graphismes Dieux Qu'Être décidé que la façon dont ils voulaient OpenGL matrice de la pile de se comporter (avec HLSL, GLSL, et d'autres systèmes: voir le lien ci-dessus à propos de la colonne principale de la commande).
Si vous avez un tableau qui représente une matrice de 4x4 comme ceci:
et de vous charger de cette dans un OpenGL matrice, OpenGL va voir les 4 premiers flotteurs que la première colonne de la matrice, le second 4 flotteurs que la deuxième colonne et la troisième de 4 flotteurs que la 3ème colonne de la matrice, etc, etc.
Donc, tous les 4 flotteurs, OpenGL voit comme une autre colonne. Ceci est connu comme la Colonne ordre Majeur.
Il stocke les données dans des colonnes. Si vous avez eu de transposer de la colonne principale de la matrice, il avait une ligne majeure de la matrice, et vice-versa.
Parce que vous avez un de la colonne principale de la matrice, vous devez également utiliser des vecteurs colonnes, ce qui signifie que votre ordre de multiplication seront: M*v.
Pour le prouver à vous-même, prenez une simple matrice 2x2 avec un 2x1 vecteur colonne, de se multiplier comme M*v. Soit K=transpose(M), et r=vecteur ligne (1x2).
Alors
M * v = r * K
Bas de ligne, une fois que vous utilisez une colonne ou une ligne majeure de notation dans votre code, vous devez vous en tenir à elle.