最終更新:
mikk_ni3_92 2010年06月27日(日) 14:41:45履歴
現在地:メニュー >> GLM >> GLM編01 >> GLM編01::まとめ3
#include <glm/glm.hpp> #include <glm/gtc/matrix_projection.hpp> #include <glm/gtc/matrix_transform.hpp> #include <GL/glut.h> //----------- プロトタイプ宣言 --------------// void display(); void reshape(int w, int h); void timer(int value); void idle(); void DRAW_XYZ(); void DRAW_TRI(); //------------- OpenGLの初期設定 ------------------// void GLUT_INIT() { glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH); //ダブルバッファ、Zバッファ glutInitWindowSize(640,480); glutCreateWindow("Basic Animation with GLM"); } void GLUT_CALL_FUNC() { glutDisplayFunc(display); glutReshapeFunc(reshape); glutIdleFunc(idle); } void MY_INIT() { glClearColor(1.0, 1.0, 1.0, 1.0); glEnable(GL_DEPTH_TEST); } //------------- メイン関数 ----------------// int main(int argc, char **argv) { glutInit(&argc,argv); GLUT_INIT(); GLUT_CALL_FUNC(); MY_INIT(); glutMainLoop(); return 0; } //------------ ここからコールバック関数 ------------------// void display() { static int r = 0; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); DRAW_XYZ(); glPushMatrix(); glRotatef(float(r), 0.f, 1.f, 0.f); glTranslatef(1.f, 0.f, 0.f); glColor3f(0.f, 1.f, 0.f); DRAW_TRI(); glPopMatrix(); glColor3d(1,1,1); //色のリセット glutSwapBuffers(); if(++r >= 360) { r = 0; } } 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(); //行列初期化 //gluPerspectiveで生成される行列を作成 glm::mat4x4 proj = glm::perspective<float>(30,float(w)/h,1,100); glMultMatrixf(&proj[0][0]);//行列を演算 glMatrixMode(GL_MODELVIEW); //行列モード切替 glLoadIdentity(); 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]);//行列を演算 } void idle() { glutPostRedisplay(); } //--------------- ここから各種関数 ----------------// void DRAW_XYZ() { glBegin(GL_LINES); glColor3f(0,1,0);//x glVertex2f(-100,0); glVertex2f(100, 0); glColor3f(1,0,0);//y glVertex2f(0,0); glVertex2f(0,100); glColor3f(0,0,1);//z glVertex3f(0,0,-100); glVertex3f(0,0, 100); glEnd(); } 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(); }