スポンサーリンク

| キーワード:

glmを試す

追記:(導入)

公開してからダウンロード元を書いていなかったので追記。

https://github.com/g-truc/glm

glm-master.zip を展開し、glm-master/ を適当な場所へ置き、glm/glm.hppをincludeできるように設定する。以下のサンプルプログラムはやや変なことをしているので気が向いたら後で修正する。

概要

OpenGLで非推奨になったglTranslate等の代わりになるライブラリglmを積極的に使っていこうと思う。includeだけで使え、リンクの必要はない。

注意点として、テンプレートを多用している関係上double→floatなどの暗黙的型変換が効かないので、0.1ではなくちゃんと0.1fと書かなければいけないような場所が多い。

使用例として、以前に書いたfreeglutのコピペ用コードをglmを使って書き直してみる。

#include <Windows.h>
#include <gl/GL.h>
#include <gl/GLU.h>
#include <gl/freeglut.h>

// mat4 等
#include <gl/glm-0.9.9/glm.hpp>

// perspective , transform 等
#include <gl/glm-0.9.9/gtc/matrix_transform.hpp>

// value_ptr 等
#include <gl/glm-0.9.9/gtc/type_ptr.hpp>


// freeglut:
// http://freeglut.sourceforge.net/

// glm
// https://github.com/g-truc/glm

//ウィンドウの幅と高さ
int width, height;

double rotate_angle = 0;


//描画関数
void disp(void) {


    glClearColor(0.2, 0.2, 0.2, 1);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glViewport(0, 0, width, height);

#if 0
    //カメラの設定
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60, width / (double)height, 0.1, 3);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslated(0, 0, -2);
    glRotated(rotate_angle, 0, 1, 0);
#else

    // 行列を計算
    glm::mat4 P = glm::perspective(glm::radians(60.f), width / (float)height, 0.1f, 3.f);

    glm::mat4 M;
    M = glm::identity<glm::mat4>();
    M = glm::translate(M, glm::vec3(0.f, 0.f, -2.f));
    M = glm::rotate(M, glm::radians((float)rotate_angle), glm::vec3(0.f, 1.f, 0.f));

    // 行列の設定

    glMatrixMode(GL_PROJECTION);
    glLoadMatrixf(glm::value_ptr(P));

    glMatrixMode(GL_MODELVIEW);
    glLoadMatrixf(glm::value_ptr(M));

#endif

    double v = 0.7;

    glBegin(GL_QUADS);
    glColor3d(0, 0, 1);
    glVertex2d(-v, -v);
    glColor3d(1, 0, 1);
    glVertex2d(v, -v);
    glColor3d(1, 1, 1);
    glVertex2d(v, v);
    glColor3d(0, 1, 1);
    glVertex2d(-v, v);

    glEnd();
    glFlush();
}

//ウィンドウサイズの変化時に呼び出される
void reshape(int w, int h) {
    width = w; height = h;

    disp();
}

void timer(int value)
{
    rotate_angle += 5;

    disp();
    glutTimerFunc(10, timer, 0);
}

//エントリポイント
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitWindowPosition(100, 50);
    glutInitWindowSize(500, 500);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);

    glutCreateWindow("sample");
    glutDisplayFunc(disp);
    glutReshapeFunc(reshape);
    glutTimerFunc(1000, timer, 0);//タイマー
    glutMainLoop();

    return 0;
}

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: