2012-08-18 6 views
0

Je peux tourner déjà sprite point 0, 90, 180, 270 degrésRotation sprite point

Fragment shaders

precision lowp float; 

uniform sampler2D us_tex; 
uniform mat3 um_tex; 

void main() 
{ 
    vec2 tex_coords = (um_tex * vec3(gl_PointCoord, 1.0)).xy; 
    gl_FragColor = texture2D(us_tex, tex_coords); 
} 

2 * 2 opérations Matrix (je sais GLM - c'est génial, le but académique pour gérer la matrice sur votre propre)

typedef GLfloat m3[9]//3*3 matrix 

#define DEG_TO_RAD(x) (x * M_PI/180.0f) 

void ident_m3(m3 res) 
{ 
memset(res, 0, sizeof(m3)); 
res[0] = res[4] = res[8] = 1.0f; 
} 

void trans_m3(m3 res, const p2* pos) 
{ 
ident_m3(res); 
res[7] = pos->x; 
res[8] = pos->y; 
} 

void mult_m3(m3 res, const m3 m1, const m3 m2) 
{ 
res[0] = m1[0] * m2[0] + m1[3] * m2[1] + m1[6] * m2[2]; 
res[1] = m1[1] * m2[0] + m1[4] * m2[1] + m1[7] * m2[2]; 
res[2] = m1[2] * m2[0] + m1[5] * m2[1] + m1[8] * m2[2]; 

res[3] = m1[0] * m2[3] + m1[3] * m2[4] + m1[6] * m2[5]; 
res[4] = m1[1] * m2[3] + m1[4] * m2[4] + m1[7] * m2[5]; 
res[5] = m1[2] * m2[3] + m1[5] * m2[4] + m1[8] * m2[5]; 

res[6] = m1[0] * m2[6] + m1[3] * m2[7] + m1[6] * m2[8]; 
res[7] = m1[1] * m2[6] + m1[4] * m2[7] + m1[7] * m2[8]; 
res[8] = m1[2] * m2[6] + m1[5] * m2[7] + m1[8] * m2[8]; 
} 

dans ParticlesDraw()

m3 r; 
rot_m3(r, 90.0f); 
... 
glUniformMatrix3fv(/*um_tex uniform*/, 1, GL_FALSE, res); 
glDrawArrays(GL_POINTS, 0, /*particles count*/); 
... 

Aussi je sais comment tourner autour sprite ordinaire pos (x, y, z)

  1. Traduire en pos (-x, -y, -z)
  2. Rotation
  3. Traduire en pos (x , y, z)

Matrice de résultat = (Rot Matrix * Matrice de traduction) * Matrice anti-traslate.

Je veux tourner sprite point à 45, 32,64,72 par exemple un degré quelconque (maintenant il tourne pas à droite, la dernière image 45 °) problem

Mais dans ce cas, je peux traduire au centre de tex (0.5, 0.5), mais que va-t-il anti-traduire - (0.0, 0.0)?
J'essaie quelque chose comme ça, mais ça ne marche pas par exemple pour 30, 45 tours, même si ma texture est 64 * 64, dois-je mettre gl_PointSize à 64.0 pour la rotation?

Répondre

2

Ce:

  1. Traduire en pos (-x, -y, -z)
  2. Rotation
  3. Traduire en pos (x, y, z)

Is not la même chose que ceci:

Result Matrix = (Rot Matrix * Translate Matrix) * Anti-Traslate Matrix.

Si vous souhaitez effectuer une rotation autour du point (x, y, z), vous devez effectuer les opérations suivantes:

  1. Matrice T1 = Translate (x, y, z);
  2. Matrice R1 = Rotation();
  3. Matrice T2 = Traduire (-x, -y, -z);

Ce qui est la même chose que:

Result Matrix = T1 * R1 * T2

Questions connexes