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

vec型


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」などがある。
【例】
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型

行列を扱うための型して「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で書き換える
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);

}

サンプルコード

gluLookAt関数で生成される行列を作る


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

サンプルコード

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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