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)
- Traduire en pos (-x, -y, -z)
- Rotation
- 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 °)
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?