이번 장에서는 앞장에서 만든 예제에 키입력 고급 기법을 사용해서 수정해보겠습니다. 새로 추가한 코드에는 주석을 달았습니다.
초기화 부분에 deltaAngle 과 deltaMove 라는 두 개의 변수를 추가했습니다. 이 변수들은 각각 카메라의 회전과 이동을 제어합니다. 0 이 아닐 때에는 카메라가 어떤 행동을 취하고 0 일 때에는 카메라가 고정되어 있습니다. 이 두 변수는 카메라의 초기 상태를 고정 상태로 만들기 위해서 0 으로 초기화합니다.
#include<math.h>#include<gl\glut.h>#include<gl\gl.h>#include<gl\glu.h>float angle=0.0, deltaAngle =0.0;float ratio;float x=0.0f,y=1.75f,z=5.0f;float lx=0.0f,ly=0.0f,lz=-1.0f;GLint snowman_display_list;int deltaMove =0;voidchangeSize(int w,int h){ // 창이 너무 작아졌을때 0 으로 나뉘는 것을 방지합니다.if(h ==0) h =1; ratio =1.0f* w / h; // 좌표계를 수정하기 전에 초기화합니다.glMatrixMode(GL_PROJECTION);glLoadIdentity(); // 뷰포트를 창 전체크기로 설정합니다. glViewport(0,0, w, h); // 절단 공간을 설정합니다.gluPerspective(45,ratio,1,1000);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(x, y, z, x + lx,y + ly,z + lz,0.0f,1.0f,0.0f);}voiddrawSnowMan(){glColor3f(1.0f,1.0f,1.0f); // 몸을 그립니다.glTranslatef(0.0f,0.75f,0.0f);glutSolidSphere(0.75f,20,20); // 머리를 그립니다.glTranslatef(0.0f,1.0f,0.0f);glutSolidSphere(0.25f,20,20); // 두 눈을 그립니다.glPushMatrix();glColor3f(0.0f,0.0f,0.0f);glTranslatef(0.05f,0.10f,0.18f);glutSolidSphere(0.05f,10,10);glTranslatef(-0.1f,0.0f,0.0f);glutSolidSphere(0.05f,10,10);glPopMatrix(); // 코를 그립니다.glColor3f(1.0f,0.5f,0.5f);glRotatef(0.0f,1.0f,0.0f,0.0f);glutSolidCone(0.08f,0.5f,10,2);}GLuintcreateDL(){ GLuint snowManDL; // 디스플레이리스트를 생성하고 id 를 반환합니다. snowManDL =glGenLists(1); // 디스플레이리스트를 시작합니다.glNewList(snowManDL,GL_COMPILE); // 렌더링을 수행하는 함수를 호출합니다.drawSnowMan(); // 디스플레이리스트를 끝마칩니다.glEndList();return(snowManDL);}voidinitScene(){glEnable(GL_DEPTH_TEST); snowman_display_list =createDL();}voidorientMe(float ang) { lx =sin(ang); lz =-cos(ang);glLoadIdentity();gluLookAt(x, y, z, x + lx,y + ly,z + lz,0.0f,1.0f,0.0f);}voidmoveMeFlat(int i){ x = x + i*(lx)*0.1; z = z + i*(lz)*0.1;glLoadIdentity();gluLookAt(x, y, z, x + lx,y + ly,z + lz,0.0f,1.0f,0.0f);}
아래 함수에 추가된 코드가 있습니다. 이 함수는 각각의 카메라 액션을 뜻하는 두 개의 변수가 0 이 아닌지 검사하고 0 이 아니라면 카메라의 필요한 동작에 적절한 함수를 호출합니다.