0

我已经可以将点精灵旋转 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)

结果矩阵 = (Rot Matrix * Translate Matrix) * Anti-Traslate Matrix。

我想将点精灵旋转到 45、32、64、72 例如任何度数(现在它旋转不正确,最后一帧 45 度) 问题

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

4

1 回答 1

2

这:

  1. 转换为 pos(-x,-y,-z)
  2. 旋转
  3. 转换为 pos(x,y,z)

和这个不是一回事:

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

如果您希望围绕点 (x,y,z) 旋转,则需要执行以下操作:

  1. 矩阵 T1 = 平移(x,y,z);
  2. 矩阵 R1 = 旋转();
  3. 矩阵 T2 = 平移(-x,-y,-z);

这与以下内容相同:

Result Matrix = T1 * R1 * T2

于 2012-08-18T20:48:00.047 回答