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

問題


光源と材質を設定し、物体を描画せよ。

その他条件:
マウスで材質や光源の状態を切替える。

 出力については⇒OpenGL::物体の色について

答え


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

enum{NONE = 0,AMB,SPEC,DIFF};
#define GOLD 1
#define SILVER 2

using namespace std;


/******************[プロトタイプ宣言]**********************/

inline void LIGHT_INIT();

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

void menu_material(int val);
void menu_light(int val);

void SET_COLOR_GOLD();
void SET_COLOR_SILVER();




/*******************[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()
{

int MENU_ID[2];

/* サブメニュー1 */
MENU_ID[0] = glutCreateMenu(menu_material);
glutAddMenuEntry("GOLD", GOLD);
glutAddMenuEntry("SILVER", SILVER);

/* サブメニュー2 */
MENU_ID[1] = glutCreateMenu(menu_light);
glutAddMenuEntry("AMB", AMB);
glutAddMenuEntry("SPEC", SPEC);
glutAddMenuEntry("DIFF", DIFF);
glutAddMenuEntry("default", NONE);

/* メインメニュー */
glutCreateMenu(NULL);
glutAddSubMenu( "Material", MENU_ID[0] );
glutAddSubMenu( "light", MENU_ID[1] );
glutAttachMenu(GLUT_RIGHT_BUTTON);

}



inline void MY_INIT()
{
glClearColor(1.0, 1.0, 1.0, 1.0);

LIGHT_INIT();
}


/*** 初期光源のセット ***/
GLfloat light0_pos[] = { 3.0, 4.0, 5.0, 1.0 };
GLfloat amb_default[] = {0.0, 0.0, 0.0, 1.0};
GLfloat diff_default[] = {1.0, 1.0, 1.0, 1.0};
GLfloat spec_default[] = {1.0, 1.0, 1.0, 1.0};
inline void LIGHT_INIT()
{
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_POSITION, light0_pos);
glLightfv(GL_LIGHT0, GL_AMBIENT, amb_default);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diff_default);
glLightfv(GL_LIGHT0, GL_SPECULAR, spec_default);
}





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;
}
glutSolidSphere(1,30,30);

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_material(int val)
{
switch(val)
{
case 1:
COLOR_FLAG = GOLD;
break;

case 2:
COLOR_FLAG = SILVER;
break;

}
}


void menu_light(int val)
{

static GLfloat light0_ambient[] = {0.0, 0.0, 1.0, 1.0};
static GLfloat light0_specular[] = {0.0, 1.0, 0.0, 1.0};
static GLfloat light0_diffuse[] = {1.0, 0.0, 0.0, 1.0};

switch(val)
{

case NONE:
glLightfv(GL_LIGHT0, GL_AMBIENT, amb_default);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diff_default);
glLightfv(GL_LIGHT0, GL_SPECULAR, spec_default);
break;

case AMB:
glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient);
break;

case SPEC:
glLightfv(GL_LIGHT0, GL_SPECULAR, light0_specular);
break;


case DIFF:
glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
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






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


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

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