現在地メニュー >> GLM >> GLM編02
Index:GLM編01 <<GLM編02>>GLM編03?

glm::mat型の「*」オペレータ


「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::mat4x4などの行列は、宣言するとコンストラクタを使って単位行列にとなる。

サンプルコード

平行移動、回転、スケーリング


平行移動、回転、スケーリングなども、その移動を実現する行列を生成して、演算することで実現できる。

使用するのは
  • 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の記述感覚。
つまり、下にある行列から影響するような雰囲気。

サンプルコード

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます