旋转点精灵

时间:2012-08-18 20:02:46

标签: opengl glsl opengl-3

我已经可以在0度,90度,180度,270度

上旋转点精灵

片段着色器

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矩阵操作(我了解GLM - 自己处理矩阵的学术目的很棒)

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];
}
ParticlesDraw()中的

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

我也知道如何在pos(x,y,z)周围旋转普通精灵

  1. 转换为pos(-x,-y,-z)
  2. 旋转
  3. 转换为pos(x,y,z)
  4. 结果矩阵=(Rot Matrix * Translate Matrix)* Anti-Traslate Matrix。

    我想将点精灵旋转到45,32,64,72,例如任何角度(现在它旋转不对,最后一帧45度) problem

    但在这种情况下,我可以转换为tex的中心(0.5,0.5),但是什么是反翻译 - (0.0,0.0)?
    我尝试这样的东西,但它不适用于例如30,45旋转,如果我的纹理是64 * 64,我是否需要将gl_PointSize设置为64.0进行旋转?

1 个答案:

答案 0 :(得分:2)

此:

  1. 转换为pos(-x,-y,-z)
  2. 旋转
  3. 转换为pos(x,y,z)
  4. 与此不一样:

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

    如果你想围绕点(x,y,z)旋转,那么你需要这样做:

    1. 矩阵T1 =翻译(x,y,z);
    2. Matrix R1 = Rotate();
    3. Matrix T2 =翻译(-x,-y,-z);
    4. 与以下内容相同:

      Result Matrix = T1 * R1 * T2