現在地 >> メニュー >> サンプルコード::OpenGL >> 材質の設定と描画

問題


M. Kilgard のカラーサンプルに従って、材質を設定し、物体を描画せよ。

その他条件:

右ボタンクリックでの簡単なメニューを作成し、
金色(GOLD)と銀色(SILVER)を切替える


関連 →材質の設定

答え



#include <GL/glut.h>
#include <GL/glu.h>
#include <GL/gl.h>
#include <iostream>

void display();
void reshape(int w, int h);
void timer(int value);
void menu(int val);


inline void SET_COLOR_GOLD();
inline void SET_COLOR_SILVER();

using namespace std;


/*******************[OpenGLの初期設定]************************/
inline void GLUT_INIT()
{
glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(200,200);
}

inline void GLUT_CALL_FUNC()
{
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutTimerFunc(1,timer,0);
}

inline void GLUT_SET_MENU()
{
#define GOLD 1
#define SILVER 2
glutCreateMenu(menu);
glutAddMenuEntry("GOLD", GOLD);
glutAddMenuEntry("SILVER", SILVER);
glutAttachMenu(GLUT_RIGHT_BUTTON);
}


inline void MY_INIT()
{
glClearColor(1.0, 1.0, 1.0, 1.0);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
}


int main(int argc, char **argv)
{
glutInit(&argc,argv);
GLUT_INIT();
glutCreateWindow("window name");
GLUT_CALL_FUNC();
GLUT_SET_MENU();
MY_INIT();
glutMainLoop();

return 0;
}


/*******[ここから各種コールバック]***************************************/
GLfloat light_pos[] = { 0.0, 3.0, 5.0, 1.0 };
int COLOR_FLAG=GOLD;

void display()
{
static int r = 0;

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

glLightfv(GL_LIGHT0, GL_POSITION, light_pos);

glEnable(GL_DEPTH_TEST);


glPushMatrix();
glRotated((double)r, 0.0, 1.0, 0.0);

switch(COLOR_FLAG)
{
case GOLD:
SET_COLOR_GOLD();
break;

case SILVER:
SET_COLOR_SILVER();
break;
}

glutSolidCube(1);
glPopMatrix();


glDisable(GL_DEPTH_TEST);


glutSwapBuffers();

r = r + 1;
if(r > 360)
{
r= 0;
}
}


void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void timer(int value)
{
glutPostRedisplay();
glutTimerFunc(1,timer,0);
}

void menu(int val)
{
switch(val)
{
case 1:
COLOR_FLAG = GOLD;
break;

case 2:
COLOR_FLAG = SILVER;
break;

}
}


/*********[ここから、各種関数]*********************/
inline void SET_COLOR_GOLD()
{
static GLfloat gold_amb[] = { 0.24725, 0.1995, 0.0745, 1.0 };
static GLfloat gold_diff[] = { 0.75164, 0.60648 , 0.22648, 1.0 };
static GLfloat gold_spe[] = { 0.628281, 0.555802,0.366065,1.0 };
static GLfloat gold_shin[] = { 51.2 };

glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, gold_amb);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, gold_diff);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, gold_spe);
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, gold_shin);
}


inline void SET_COLOR_SILVER()
{
static GLfloat silver_amb[] = {0.19225, 0.19225,0.19225 ,1.0};
static GLfloat silver_diff[] = { 0.50754,0.50754,0.50754, 1.0 };
static GLfloat silver_spe[] = { 0.508273,0.508273,0.508273,1.0};
static GLfloat silver_shin[] = { 51.2 };

glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, silver_amb);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, silver_diff);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, silver_spe);
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, silver_shin);
}

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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