平行移動、回転、スケーリングなども、その移動を実現する行列を生成して、演算することで実現できる。
使用するのは
- 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の記述感覚。
つまり、下にある行列から影響するような雰囲気。