[CG]시점변환
2021. 1. 5. 21:24ㆍHi/Computer_Graphics
키보드를 입력하여 카메라의 시점을 바꾸는 코드입니다.
#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
'Hi > Computer_Graphics' 카테고리의 다른 글
[CG] 태양계 모델링 (0) | 2021.01.05 |
---|---|
Computer Graphics (0) | 2020.12.07 |