OpenGL
OpenGLでOBJファイルを読み込む
・今回はglm.hとglm.cをつかって読み込んでみる
2つのファイルはhttp://www.opengl.org/resources/libraries/glut/からDLしてくる
(3.7 Source Code Download for Win32というファイル、なお3.7の部分はバージョン名なので最新のものをDLしてくるといい)
・解凍して、progs->demos->smoothにglm.hとglm.cファイルがあるのでコピーしてプロジェクトに持ってくる
OBJファイルも用意してプロジェクトにおいておく
・プログラムの本体を書く
main.cpp
#include <stdio.h>
#include "glm.h"
// 変数宣言
GLMmodel *Model;
char *FileName="test.obj"; // 自分で用意したobjファイルを読み込む
// プロトタイプ宣言
void display();
void reshape(int w, int h);
// モデルのロード
void ModelLoad()
{
// モデルの読み込み
Model = glmReadOBJ(FileName);
// 法泉データの計算
glmFacetNormals(Model);
// 頂点の法線を計算、スムージング角は90度
glmVertexNormals(Model,90);
// 単位化
glmUnitize(Model);
}
// OpenGLのFuncの初期化
void GLUT_CALL_FUNC()
{
glutDisplayFunc(display);
glutReshapeFunc(reshape);
}
// その他の設定
void OTHER_INIT()
{
glClearColor(0.0, 0.0, 1.0, 1.0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_NORMALIZE);
ModelLoad();
}
// 初期化
void GLUT_INIT(int *argcp, char **argv)
{
glutInit(argcp, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(600,400);
glutCreateWindow("Model Loader");
GLUT_CALL_FUNC();
OTHER_INIT();
}
int main(int argc, char **argv)
{
GLUT_INIT(&argc, argv);
glutMainLoop();
return 0;
}
//-------------------コールバック------------------------//
void display()
{
//光源の位置
static float Light0Pos[]={-10.0, 10.0, 10.0,0};
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(3.0, 4.0, 5.0, 0,0,0, 0.0, 1.0, 0.0);
//位置だけ設定(あとはデフォルト)
glLightfv(GL_LIGHT0, GL_POSITION, Light0Pos);
glmDraw(Model,GLM_SMOOTH);
glutSwapBuffers();
}
void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30.0, (double)w / (double)h, 0.1, 1000.0);
glMatrixMode(GL_MODELVIEW);
}
参考サイト(参考日:2011/03/3)