現在地 >> メニュー >> 基本編05 >> まとめコード::基本編05
関連:まとめコード::基本編05_2まとめコード::基本編05_3


問題


光源・材質を設定し、球を描画せよ。
その他条件:
  • 材質は「金」にする。

答え

#include <GL/glut.h>

//------------ プロトタイプ宣言 -------------------//
void LIGHT_INIT();
void display();
void reshape(int w, int h);
void SetMaterialGold();

//------------- OpenGLの初期設定 --------------//
void GLUT_INIT()
{
	glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH);
	glutInitWindowSize(640,480);
	glutCreateWindow("Golden Ball");
}

void GLUT_CALL_FUNC()
{
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
}


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

	LIGHT_INIT();
	glEnable(GL_NORMALIZE);//法線の有効化
	glEnable(GL_DEPTH_TEST);//ZバッファON
}



//光源の設定
void LIGHT_INIT()
{
	glEnable(GL_LIGHTING);//光源の有効化
	glEnable(GL_LIGHT0);
}


//----------- メイン関数 --------------//
int main(int argc, char **argv)
{
	glutInit(&argc,argv);
	GLUT_INIT();
	GLUT_CALL_FUNC();
	MY_INIT();
	glutMainLoop();

	return 0;
}

//------------ ここから各種コールバック ---------------//
void display()
{
	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); //視点の設定

	static float Light0Pos[]={1,1,1,0}; //光源の位置
	glLightfv(GL_LIGHT0, GL_POSITION, Light0Pos);//位置だけ設定(あとはデフォルト)
	SetMaterialGold(); //材質
	glutSolidSphere(0.5,60,60);//球の描画

	glutSwapBuffers();
}


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);
}




//---------- ここから各種関数 ------------//
void SetMaterialGold()
{
	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);
	glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, gold_shin);

}

【メモ】

例えば、光源の位置設定を「init関数内」で設定して、視点位置(-3,4,-5)から見ると、
明らかに結果がおかしくなる。(本来は、暗いはずである)

【例】
光源位置(1,1,1),視点位置(-3,4,-5)から見た時の違い

▲オブジェクト座標系で設定▲init関数内で設定

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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