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 マトリックス * Translate マトリックス) * Anti-Translate マトリックス。

ポイント スプライトを 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 = Translate(x, y, z);
  2. マトリックス R1 = Rotate();
  3. 行列 T2 = Translate(-x, -y, -z);

これは次と同じです:

Result Matrix = T1 * R1 * T2

于 2012-08-18T20:48:00.047 に答える