ํค๋ณด๋๋ฅผ ์ ๋ ฅํ์ฌ ์นด๋ฉ๋ผ์ ์์ ์ ๋ฐ๊พธ๋ ์ฝ๋์ ๋๋ค.
#include <glut.h>
static float C_x, C_y, C_z = 2;
static int rotateX = 0, rotateX_ = 0, rotateY = 0, rotateY_ = 0, rotateZ = 0, rotateZ_ = 0;
void InitLight() {
GLfloat mat_diffuse[] = { 0.5, 0.4, 0.3, 1.0 }; //GLfloat๋ ๋ณ์ ํ์
๋ช
์ค์ ํ๋๊ฒ.
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_ambient[] = { 0.5, 0.4, 0.3, 1.0 };
GLfloat mat_shininess[] = { 15.0 };
GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_diffuse[] = { 0.8, 0.8, 0.8, 1.0 };
GLfloat light_ambient[] = { 0.3, 0.3, 0.3, 1.0 };
GLfloat light_position[] = { -3, 6, 3.0, 0.0 };
glShadeModel(GL_SMOOTH);//์์ด๋ฉ ๊ธฐ์ ์ ๋ํ๋ด๋ ๊ธฐํธ ์์๋ฅผ ์ง์ .๊ธฐํธ ์์์ ์ข
๋ฅ : GL_FLAT, GL_SMOOTH. ๊ธฐ๋ณธ๊ฐ์ GL_SMOOTH
glEnable(GL_DEPTH_TEST);//(์ํ์๊ธฐ)๊ธฐ๋ฅ์ ํ์ฑํ ์ํจ๋ค.
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);//๊ด์์ค์ , ๊ด์ ์์น ์ค์
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);// ํ์ฐ๊ด(๋ถ์ฐ๊ด) ์ฑ๋ถ ์ค์
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);//๊ฒฝ๋ฉด๊ด(๋ฐ์ฌ๊ด)์ ์ธ๊ธฐ
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);// ์ฃผ๋ณ๊ด ์ฑ๋ถ ์ค์
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);//๋์ค์ ํ์ชฝ๋ฉด์ ์ง๊ฐ์ ์ค์ ํ ๊ฒ์ธ๊ฐ๋ฅผ ์ง์ .GL_FRONT(๊ฒ), GL_BACK(๋ด๋ฉด), GL_FORNT_AND_BACK(์๋ฉด)์ค์ ํ๋๋ฅผ ์ฌ์ฉ.
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
}
void MyDisplay() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// ๊ฐ์ ์ง์ ํ๊ธฐ ์ํ ๋ฒํผ์ ์ด๊ธฐํ
glMatrixMode(GL_MODELVIEW);//๋ชจ๋ธ ์ขํ๊ณ์ ์์ ์ขํ๊ณ(GL_MODELVIEW) ์ ๊ณต๊ฐ์ ์์ผ๋ก ๊ณ์ฐํ๊ฒ ๋ค๋ ๋ป. ์ฌ๋ฌผ, ์์ ์ ํํํ๊ธฐ ์ ์ ์ ์ธ
glLoadIdentity();//์ขํ๊ณ๋ฅผ ์ด๊ธฐํ
gluLookAt((GLfloat)C_x, (GLfloat)C_y, (GLfloat)C_z, (GLfloat)C_x, (GLfloat)C_y, -1, 0, 1.0, 0.0); //์์ ์์น ๋ฐฉํฅ ์ค์
glRotatef((GLfloat)rotateX, 1.0, 0.0, 0.0); // ๋ชจ๋ธ์ ํ์
glRotatef((GLfloat)rotateX_, -1.0, 0.0, 0.0);
glRotatef((GLfloat)rotateY, 0.0, 1.0, 0.0);
glRotatef((GLfloat)rotateY_, 0.0, -1.0, 0.0);
glRotatef((GLfloat)rotateZ, 0.0, 0.0, 1.0);
glRotatef((GLfloat)rotateZ_, 0.0, 0.0, -1.0);
glutSolidTeapot(0.5);//๋ฉด์ผ๋ก์ฃผ์ ์๊ทธ๋ฆฌ๊ธฐ
glFlush();//GL ๋ช
๋ น์ด ๊ฐ์ ์คํ
}
void MyReshape(int w, int h) {
glViewport(0, 0, (GLsizei)w, (GLsizei)h);//๋ทฐํฌํธ ์์น์ ํฌ๊ธฐ ์ค์
glMatrixMode(GL_PROJECTION); //ํฌ์ ์ขํ๊ณ(GL_PROJECTION) ์ ๊ณต๊ฐ์ ์์ผ๋ก ๊ณ์ฐํ๊ฒ ๋ค๋ ๋ป. ํฌ์์ ํํํ๊ธฐ ์ ์ ์ ์ธ
glLoadIdentity();//์ขํ๊ณ ์ด๊ธฐํ
glFrustum(-1, 1, -1, 1, 1, 50); //์์ ์ ๊ธฐ์ค์ผ๋ก ์ข, ์ฐ, ์, ํ, ์ , ํ ์ค์
}
void MyKeyboard(unsigned char key, int x, int y) {
switch (key) {
case 'a':
C_x += 0.1f;
glutPostRedisplay();
break;
case 's':
C_x -= 0.1f;
glutPostRedisplay();
break;
case 'd':
C_y += 0.1f;
glutPostRedisplay();
break;
case 'f':
C_y -= 0.1f;
glutPostRedisplay();
break;
case 'z':
C_z += 0.1f;
glutPostRedisplay();
break;
case 'x':
C_z -= 0.1f;
glutPostRedisplay();
break;
case 'g':
rotateX = (rotateX + 10) % 360;
glutPostRedisplay();
break;
case 'h':
rotateX_ = (rotateX_ + 10) % 360;
glutPostRedisplay();
break;
case 'j':
rotateY = (rotateY + 10) % 360;
glutPostRedisplay();
break;
case 'k':
rotateY_ = (rotateY_ + 10) % 360;
glutPostRedisplay();
break;
case 'l':
rotateZ = (rotateZ + 10) % 360;
glutPostRedisplay();
break;
case 'm':
rotateX_ = (rotateX_ + 10) % 360;
glutPostRedisplay();
break;
default:
break;
}
}
int main(int argc, char** argv) {
glutInit(&argc, argv);// GLUT ์๋์ฐ ํจ์
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH); //์๋์ฐ ์ ๊ธฐ๋ณธ์ปฌ๋ฌ๋ชจ๋๋ฅผ ์ ๊ฑธ๋ก ์ค์
glutInitWindowSize(400, 400);// ์๋์ฐ ์ฌ์ด์ฆ ์ค์
glutInitWindowPosition(0, 0); // ์๋์ฐ ์ฐฝ ์์น ์ค์
glutCreateWindow("Kihoon Project");
glClearColor(0.4, 0.4, 0.4, 0.0);// GL ์ํ๋ณ์ ์ค์ , ๋ง์ง๋ง ์ํ๊ฐ์ 1์ด๋ฉด ๋ถํฌ๋ช
0์ด๋ฉด ํฌ๋ช
InitLight();
glutDisplayFunc(MyDisplay);// GLUT ์ฝ๋ฐฑํจ์ ๋ฑ๋ก
glutReshapeFunc(MyReshape);//์ฝ๋ฐฑํจ์
glutKeyboardFunc(MyKeyboard);//ํค๋ณด๋ํจ์
glutMainLoop(); // ์ด๋ฒคํธ ๋ฃจํ ์ง์
return 0;
}
728x90
๋ฐ์ํ