最終更新: mikk_ni3_92 2007年12月17日(月) 12:35:35履歴
現在地 >> メニュー >> サンプルコード::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);
}
#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);
}