最終更新:
mikk_ni3_92 2010年06月27日(日) 14:39:46履歴
現在地:メニュー >> GLM >> GLM編01
Index:GLM編00 <<GLM編01>>GLM編02
GLMを使用するとよく出てくる型として、vec型がある。
これはGLSLの仕様に合わせたもので次のようになっている。
GLMを使うと、「glm::perspective関数」のようなもので行列を作ることができるが、
gluLookAt関数に対応するものがなさそう。
これを作るとこんな感じになる
Index:GLM編00 <<GLM編01>>GLM編02
GLMを使用するとよく出てくる型として、vec型がある。
これはGLSLの仕様に合わせたもので次のようになっている。
- uvec2,uvec3,uvec4 → 2,3,4要素を持つunsigned int型
- vec2,vec3,vec4 → 2,3,4要素を持つfloat型
- dvec2,dvec3,dvec4 → 2,3,4要素を持つdouble型
- ivec2,ivec3,ivec4 → 2,3,4要素を持つint型
- bvec2,bvec3,bvec4 → 2,3,4要素を持つbool型
- …
オペレータ[]でのアクセスや、
メンバ変数でのアクセス「.x」「.y」「.z」、「.r」「.g」「.b」などがある。
【例】
メンバ変数でのアクセス「.x」「.y」「.z」、「.r」「.g」「.b」などがある。
【例】
void DRAW_TRI() { static glm::vec3 pt1(0,1,0); static glm::vec3 pt2(-0.5,0,0); static glm::vec3 pt3(0.5,0,0); glBegin(GL_TRIANGLES); glVertex3fv(&pt1[0]); //アドレスを指定するパターン glVertex3f(pt2[0],pt2[1],pt2[2]); //オペレータを使うパターン glVertex3f(pt3.x,pt3.y,pt3.z);//メンバ変数を使うパターン glEnd(); }
行列を扱うための型して「mat型」が用意されている。
これは
これは
- mat2,mat3,mat4 → 縦方向に2,3,4要素
- mat2x2,mat2x3,mat2x4 → 縦方向2,横方向2,3,4要素
- mat3x2,mat3x3,mat3x4 → 縦方向3,横方向2,3,4要素
- mat4x2,mat4x3,mat4x4 → 縦方向4,横方向2,3,4要素
OpenGLの仕様に合わせて、「column-major matrix」になっている。

従って、たとえば「mat4x4型」で上の図のm[10]にアクセスする場合、
matrix[2][2] や matrix[2].z
などとなる。
【例】:gluPerspective関数での設定部分をGLMで書き換える
従って、たとえば「mat4x4型」で上の図のm[10]にアクセスする場合、
matrix[2][2] や matrix[2].z
などとなる。
【例】:gluPerspective関数での設定部分をGLMで書き換える
void reshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); //行列モード切替 glLoadIdentity(); //行列初期化 //gluPerspectiveで生成される行列を作成 glm::mat4x4 proj = glm::perspective<float>(30,float(w)/h,1,100); glMultMatrixf(&proj[0][0]);//行列を演算 glMatrixMode(GL_MODELVIEW); //行列モード切替 glLoadIdentity(); gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); }
GLMを使うと、「glm::perspective関数」のようなもので行列を作ることができるが、
gluLookAt関数に対応するものがなさそう。
これを作るとこんな感じになる
glm::mat4x4 myBuildLookAtMatf(GLfloat eyeX, GLfloat eyeY, GLfloat eyeZ, GLfloat centerX, GLfloat centerY, GLfloat centerZ, GLfloat upX, GLfloat upY, GLfloat upZ) { glm::vec3 target(centerX, centerY, centerZ); glm::vec3 eye(eyeX, eyeY, eyeZ); glm::vec3 up(upX, upY, upZ); glm::vec3 f(glm::normalize(target-eye)), s(glm::normalize(glm::cross(f, glm::normalize(up)))), u(glm::normalize(glm::cross(s, f))); glm::mat4 m(s[0], s[1], s[2], 0, u[0], u[1], u[2], 0, -f[0], -f[1], -f[2], 0, 0, 0, 0, 1); return glm::translate<float>(glm::inverse(m), -eye); } void reshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); //行列モード切替 glLoadIdentity(); //行列初期化 glm::mat4x4 proj = glm::perspective<float>(30,float(w)/h,1,100); glMultMatrixf(&proj[0][0]); glMatrixMode(GL_MODELVIEW); //行列モード切替 glLoadIdentity(); //gluLookAt関数の代わり glm::mat4x4 lookAtM = myBuildLookAtMatf(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glMultMatrixf(&lookAtM[0][0]);//行列を演算 }▲計算方法は定義通りそのままを記述