2017-10-16 9 views
3

Je suis novice dans l'utilisation de GLSL et d'openGL. Actuellement je travaille avec webgl et je modifie les shaders (vsglsls et fs.glsl) pour comprendre le GLSL et la programmation graphique. J'ai un modèle que je veux mettre à l'échelle, faire pivoter et traduire. La mise à l'échelle et la rotation fonctionnent bien mais quand je multiplie la matrice de traduction, le résultat est bizarre. Je sais que c'est une question très simple, mais il me manque quelque chose et je dois le découvrir. mon modèle est infiniment étiré à travers l'axe y. Toute aide serait appréciée.La traduction de la matrice dans GLSL est infiniment étirée

The white area is supposed to be the eye of the model ceci est mon code de vertex shaders:

mat4 rX = mat4 (
1.0, 0.0, 0.0, 0.0, 
0.0, 0.0, -1.0, 0.0, 
0.0, 1.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 1.0 
); 

mat4 rZ = mat4 (
0.0, 1.0, 0.0, 0.0, 
-1.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 1.0, 0.0, 
0.0, 0.0, 0.0, 1.0 
); 

mat4 eyeScale = mat4 (
.50,0.0,0.0,0.0, 
0.0,.50,0.0,0.0, 
0.0,0.0,.50,0.0, 
0.0,0.0,0.0,1.0 
); 
mat4 eyeTrans = mat4(
1.0,0.0,0.0,0.0, 
0.0,1.0,0.0,4.0, 
0.0,0.0,1.0,0.0, 
0.0,0.0,0.0,1.0 
); 
mat4 iR = eyeTrans*rZ*rX*eyeScale; 
gl_Position = projectionMatrix * modelViewMatrix *iR* vec4(position, 1.0); 
} 
+0

Qu'est-ce que cela signifie "résultat est bizarre"? Notez que les multiplications matricielles ne sont pas commutatives. Essayez 'mat4 iR = eyeScale * rX * rZ * eyeTrans;'. Peut-être [Rotation d'un objet multi-parties] (https://stackoverflow.com/questions/46720166/rotating-a-multipart-object/46722875#46722875) ou [Déplacer un objet OpenGL et conserver la transformation] (https://stackoverflow.com/ questions/46720166/rotary-a-multipart-object/46722875 # 46722875) peut aussi aider. – Rabbid76

+0

@ Rabbid76 Je l'ai essayé à nouveau et le même résultat. au lieu de traduire le modèle, il étire le modèle. Je vais ajouter une image à la question afin que vous puissiez voir le résultat. – femchi

Répondre

4

Vous permuté des lignes et des colonnes, lorsque vous configurez la matrice de traduction

Modifier à:

mat4 eyeTrans = mat4(
    1.0, 0.0, 0.0, 0.0, 
    0.0, 1.0, 0.0, 0.0, 
    0.0, 0.0, 1.0, 0.0, 
    0.0, 4.0, 0.0, 1.0 
); 


Une matrice 4 * 4 ressemble à ceci:

c0 c1 c2 c3   c0 c1 c2 c3 
[ Xx Yx Zx Tx ]  [ 0 4 8 12 ]  
[ Xy Yy Zy Ty ]  [ 1 5 9 13 ]  
[ Xz Yz Zz Tz ]  [ 2 6 10 14 ]  
[ 0 0 0 1 ]  [ 3 7 11 15 ] 

En GLSL les colonnes sont traitées comme ceci:

vec4 c0 = eyeTrans[0].xyzw; 
vec4 c1 = eyeTrans[1].xyzw; 
vec4 c2 = eyeTrans[2].xyzw; 
vec4 c3 = eyeTrans[3].xyzw; 

Et l'image mémoire d'un 4 * 4 matrice ressemble à ceci:

[ Xx, Xy, Xz, 0, Yx, Yy, Yz, 0, Zx, Zy, Zz, 0, Tx, Ty, Tz, 1 ] 

Voir plus: