Modèle de matrice dans les GLM
- Je migrer de mon propre matrice/vecteur des opérations de GLM et je ne comprends pas une chose.
Un modèle de matrice en OpenGL - model_matrix = scale_matrix * rotate_matrix * translate_matrix, nous avons d'abord traduire puis tourner et à la dernière échelle.
Mais ensuite, j'essaie de le faire dans GLM il montre quad au bon endroit seulement si j'utilise l'ordre inverse de la multiplication (traduire * rotation * à l'échelle), mais fonctionne comme il se doit pour le MVP de la matrice (projection * vue * modèle).
Exemple de code
using namespace glm;
mat4 projection = ortho(0.0f, 1.0f, 0.0f, 1.0f);
mat4 translate = translate(mat4(1.0f), vec3(0.5f, 0.5f, 0.0f));
mat4 rotate = rotate(mat4(1.0f), 90.0f, vec3(0.0f, 0.0f, 1.0f));
mat4 scale = scale(mat4(1.0f), vec3(0.5f, 0.5f, 1.0f));
mat4 m = translate * scale * rotate;//must be scale * rotate * translate
mat4 mvp = projection * mat4(1.0f)/*view matrix*/ * m;
glUseProgram(shader->prog);
glUniformMatrix4fv(shader->uniforms[0]/*um_mvp*/, 1, GL_FALSE, value_ptr(mvp));
...
Vertex shader
attribute vec3 av_pos;
attribute vec2 av_tex;
uniform mat4 um_mvp;
varying vec2 vv_tex;
void main()
{
vv_tex = av_tex;
gl_Position = um_mvp * vec4(av_pos, 1.0);
}
"Un modèle de matrice en OpenGL - model_matrix = scale_matrix * rotate_matrix * translate_matrix" selon qui? Êtes-vous parler de ce que la glRotate/Échelle/Traduire fonctions? Ou êtes-vous parler d'autre chose?
Bien est-il pas? Si nous translateX(5) * scaleX(2.0) nous avons échelle coords système x à 2.0 puis passer à 10 au lieu de 5 unités à cause de cela, si nous scaleX(2.0) * translateX(5) puis nous passons à 5 unités, alors échelle coords système, l'ordre des questions, non?
Bien est-il pas? Si nous translateX(5) * scaleX(2.0) nous avons échelle coords système x à 2.0 puis passer à 10 au lieu de 5 unités à cause de cela, si nous scaleX(2.0) * translateX(5) puis nous passons à 5 unités, alors échelle coords système, l'ordre des questions, non?
OriginalL'auteur Aristarhys | 2012-10-11
Vous devez vous connecter pour publier un commentaire.
... Bien, bien au contraire.
Votre "complète" de la matrice ressemble à ceci (en laissant le tourner de côté pour des raisons de simplicité) :
droit ? Eh bien, c'est correct: cela signifie que votre point de X sera transformé de cette façon :
ce qui signifie que vous serez d'abord appliquer l'échelle, puis la traduction, puis le positionnement par rapport à la caméra, puis de la projection. Ce qui est parfait.
Votre problème semble être le "scale-avant-de traduire des" choses". Imaginez une traduction de 10 sur l'axe des X, une échelle de 2. Vous appliquez votre matrice, disons, d'un navire.
Cela fait-il sens ?
(Source: opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/)
OriginalL'auteur Calvin1602