最終更新: mikk_ni3_92 2010年07月09日(金) 23:26:13履歴
現在地:メニュー >> GLM >> GLM編02
Index:GLM編01 <<GLM編02>>GLM編03?
「glm::mat型」にはオペレータとして「*」がある。
乗算をしてくれるオペレータだが、順番には注意が必要。
たとえば
行列A
[1,1]
[0,0]
行列B
[1,1]
[1,1]
に対し、行列演算A*B、を行う場合は次のようになる
【例】
よって、サイトのサンプルにもあるが「ModelViewProjection行列」は
平行移動、回転、スケーリングなども、その移動を実現する行列を生成して、演算することで実現できる。
使用するのは
【例1】
上の例では、1つ1つ行列を用意したが次のようにまとめて記述することもできる。
【例2】
演算順に注意。この場合は普段のOpenGLの記述感覚。
つまり、下にある行列から影響するような雰囲気。
Index:GLM編01 <<GLM編02>>GLM編03?
「glm::mat型」にはオペレータとして「*」がある。
乗算をしてくれるオペレータだが、順番には注意が必要。
たとえば
行列A
[1,1]
[0,0]
行列B
[1,1]
[1,1]
に対し、行列演算A*B、を行う場合は次のようになる
【例】
glm::mat2x2 A;//コンストラクタで単位行列化 A[0].y = 1;//[1,1] A[1].y = 0;//[0,0] glm::mat2x2 B;//コンストラクタで単位行列化 B[0].y = 1;//[1,1] B[1].x = 1;//[1,1] glm::mat2x2 AB = B * A;//順番に注意 for(int loop = 0; loop < 2; ++loop) { std::cout << AB[loop].x << "," << AB[loop].y << "\n"; }つまり、数学出てくる乗算とは逆になっているので注意。
よって、サイトのサンプルにもあるが「ModelViewProjection行列」は
glm::mat4 Projection = glm::mat4 View = glm::mat4 Model = glm::mat4 MVP = Projection * View * Model; //順番に注意となる。
平行移動、回転、スケーリングなども、その移動を実現する行列を生成して、演算することで実現できる。
使用するのは
- glm::translate関数(平行移動)
- glm::rotate関数(回転)
- glm::scale関数(スケーリング)
- …など
【例1】
glm::mat4x4 matI;//単位行列 glm::mat4x4 matT; glm::mat4x4 matR; glm::mat4x4 matRT;//RotateMat * transMat matT = glm::translate<float>(matI,glm::vec3(1.f, 0.f, 0.f)); matR = glm::rotate<float>(matI,float(r),glm::vec3(0.f, 1.f, 0.f)); matTR = matR * matT;//右にある行列が先に影響する glPushMatrix(); //glRotatef(float(r), 0.f, 1.f, 0.f); //glTranslatef(1.f, 0.f, 0.f); glMultMatrixf(&matTR[0][0] ); DRAW(); glPopMatrix();
上の例では、1つ1つ行列を用意したが次のようにまとめて記述することもできる。
【例2】
glm::mat4x4 transRotMat; transRotMat = glm::rotate<float>(transRotMat,float(r),glm::vec3(0.f, 1.f, 0.f)); transRotMat = glm::translate<float>(transRotMat,glm::vec3(1.f, 0.f, 0.f));//下から影響する glPushMatrix(); //glRotatef(float(r), 0.f, 1.f, 0.f); //glTranslatef(1.f, 0.f, 0.f); glMultMatrixf(&transRotMat[0][0] ); DRAW_TRI(); glPopMatrix();
演算順に注意。この場合は普段のOpenGLの記述感覚。
つまり、下にある行列から影響するような雰囲気。