最終更新:
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]);//行列を演算
}
▲計算方法は定義通りそのままを記述
