[CG]시점변환

2021. 1. 5. 21:24Hi/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