Members‎ > ‎Wataru-Fujimura‎ > ‎

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)


ċ
OBJLOAD.zip
(470k)
Wataru Fujimura,
Mar 2, 2011, 10:53 PM
Comments