[App 개발] NeHe Lesson 4
본문
지난 시간에 썼던 코드에 몇 가지만 추가하면 됩니다. 밑에는 전체 코드를 기록할 것이기 때문에 어떤 부분이 추가되었고 어떤 부분을 변경해야 되는지 쉽게 알 수 있을 것입니다. (제 번역에서는 안 하겠습니다. ^^;)
먼저 우리는 각각의 도형의 회전을 기록하는 두 개의 변수를 프로그램의 맨 위에 더할 것입니다. 이 변수는 부동소숫점으로 선언되어 있어서 도형의 회전을 매우 정밀하게 만들 수 있을 것입니다. 1, 2, 3같은 정수뿐만 아니라 1.1, 1.7, 2.3, 아니면 1.015같은 값도 각도 지정에 사용할 수 있습니다. OpenGL프로그래밍은 부동소숫점을 기본으로 사용하고 있습니다. 새로 선언하는 변수의 이름은 각각 rtri, rquad라고 하겠습니다.
Glfloat rtri; // 삼각형의 회전 각도
Glfloat rquad; // 사각형의 회전 각도
이제 DrawGLScene()함수를 변경하겠습니다. 여러분이 원래 코드에서 어떤 부분이 변경되었는지를 쉽게 알아보실 수 있게 하기 위해서 전체 코드를 몽땅 기록하도록 하겠습니다. 그리고 왜 그것이 변경되었으며 새 코드는 어떤 일을 하는지 설명하도록 하겠습니다. 밑에 있는 코드는 지난 시간의 것과 동일합니다.
int DrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(-1.5f,0.0f,-6.0f);
이제부터 나오는 코드는 새로 추가된 것입니다. glRotatef( Angle, Xvector, Yvector, Zvector) 함수는 축을 기준으로 도형을 회전하는 일을 합니다. 앞으로 여러분은 이 함수를 아주 많이 쓰게 될 것입니다. Angle은 도형을 얼마나 회전시킬 것인가를 결정하는 변수입니다. Xvector, Yvector, Zvector는 회전시킬 방향을 가리키는 벡터값입니다. 만약 이 값이 (1,0,0)이라면 x축으로 오른쪽 방향으로 1유닛 방향을 가리키는 벡터가 됩니다. 만약 (-1,0,0)이라면 동일한 x축 방향이지만 이번에는 왼쪽을 가리키는 벡터가 됩니다.
이해를 돕기 위해서 예를 들어 설명하겠습니다.
X축 회전 톱날이 하나 있다고 생각해 봅시다. 톱날의 축이 톱날 가운데를 뚫고 왼쪽으로부터 오른쪽으로 (OpenGL의 x축같이)놓여 있습니다. 축이 어느 방향으로 움직이느냐에 따라서 톱날이 어떻게 회전될지 결정됩니다. 만약 여러분이 x축의 어떤 방향으로 벡터를 지정하느냐에 따라서 OpenGL도 톱날이 돌아가는 것과 같은 똑같은 방식으로 물체를 회전시킬 것입니다.
Y축 만약 여러분이 어떤 평원 한 가운데에 서 있는데, 커다란 태풍이 여러분을 향해서 다가오고 있다고 해 봅시다. (흐미 무시라…) 태풍의 한 가운데는 (마치 OpenGL의 y축이 위아래로 놓인 것처럼) 하늘에서부터 땅을 향하고 있습니다. 태풍이 회전하는 방향으로 온갖 먼지와 잡동사니들이 y축 주변을 (태풍의 가운데 축) 오른쪽에서 왼쪽으로 혹은 왼쪽에서 오른쪽으로 회전하고 있습니다. 만약에 여러분이 y축의 어떤 방향으로 벡터를 지정한다면 OpenGL도 태풍이 하는 방식으로 물체를 회전시킬 것입니다.
Z축 선풍기를 앞에 놓고 보고 있다고 합시다. 선풍기의 한 가운데는 (마치 OpenGL의 z축처럼) 여러분을 향하고 있습니다. 선풍기의 날개는 z축을 중심으로 (선풍기의 한 가운데) 시계방향 아니면 반시계방향으로 회전을 합니다. 만약 여러분이 z축 방향으로 벡터를 지정한다면 OpenGL은 선풍기 날개와 똑같은 방식으로 물체를 회전시킬 것입니다.
따라서 다음의 코드에서 만약 rtri의 값이 7이었다면 물체는 Y축 방향으로 왼쪽에서 오른쪽으로 7도만큼 회전할 것입니다. 한 번 실험을 해 보십시오. x벡터를 0.0f에서 1.0f로 바꾸고, y벡터를 1.0f에서 0.0f로 바꾸어서 삼각형이 어떻게 회전하는지를 살펴보십시오. 한 가지 중요한 점은 회전각도는 degree입니다. 만약 rtri값이 10이라면 삼각형은 y축 방향으로 10도만큼 회전할 것입니다.
glRotatef(rtri,0.0f,1.0f,0.0f); // y축 방향으로 회전한다
그 다음 코드는 변경사항이 없습니다. 지난시간에 그렸던 알록달록한 삼각형이 화면 왼쪽에 그려질 것이고, 이것이 y축을 중심으로 왼쪽에서 오른쪽으로 회전할 것입니다.
glBegin(GL_TRIANGLES);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f( 0.0f, 1.0f, 0.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f, 0.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f( 1.0f,-1.0f, 0.0f);
glEnd();
이제부터의 코드에 주목해 주십시오. glLoadIdentity()함수를 다시 한 번 호출했습니다. 우리는 이것을 뷰를 리셋할 때 사용했습니다. 만약 뷰를 리셋하지 않고 회전되어 있는 상태 그대로 축을 이동한다면 우리는 예상치 못한 결과를 얻을 수 밖에 없습니다. 축이 회전되어 있는 상태이기 때문에 예상치 못한 방향으로 이동하게 됩니다. 만약 그대로 x축 방향으로 이동을 하게 되면 우리는 축이 회전한 상황에 따라서 위쪽이나 아래쪽으로 이동되어 있을 것입니다. 따라서 glLoadIdentity()를 써서 내가 의도했던 것을 만들려는 것입니다.
축이 초기화되었기 때문에 축을 이동하게 되면 x값은 왼쪽에서 오른쪽으로, y값은 위아래로, z값은 화면으로 전후로 이동하는 값입니다. 지난 시간의 프로그램에서는 3.0유닛만큼 이동하였지만, 이번에는 1.5유닛만큼만 이동합니다. 화면 중앙으로 초기화되었기 때문에 1.5유닛을 더 이동해야 할 필요가 없습니다.
화면 오른쪽으로 움직인 다음에는 사각형을 x축 방향으로 회전시키겠습니다. 따라서 사각형은 위아래로 회전하게 됩니다.
glLoadIdentity();
glTranslatef(1.5f,0.0f,-6.0f);
glRotatef(rquad,1.0f,0.0f,0.0f); // 사각형을 x축을 중심으로 회전
그 다음 코드는 동을합니다. 파란 색 사각형을 오른쪽 화면에 회전된 축을 기준으로 그리게 될 것입니다.
glColor3f(0.5f,0.5f,1.0f);
glBegin(GL_QUADS);
glVertex3f(-1.0f, 1.0f, 0.0f);
glVertex3f( 1.0f, 1.0f, 0.0f);
glVertex3f( 1.0f,-1.0f, 0.0f);
glVertex3f(-1.0f,-1.0f, 0.0f);
glEnd();
다음의 두 줄은 새로 추가된 것입니다. 프로그램의 위에서 우리는 두 개의 변수 rtri, rquad를 선언했고, 이것을 기억장소처럼 쓸 것입니다. 처음에 기억장소를 만들 때에는 값이 0이었습니다. 첫 번째 줄에서는 그 기억장소의 값을 0.2만큼 증가시킬 것입니다. 따라서 프로그램이 이 부분을 지날 때마다 rtri 기억장소의 값은 0.2만큼 증가할 것입니다. 그리고 rquad 기억장소의 값은 0.15만큼 감소합니다. 따라서 프로그램이 진행되면서 rquad는 0.15만큼 계속 감소합니다. 값이 감소한다는 것은 값이 증가할 때의 회전 방향의 반대방향으로 회전을 뜻합니다.
한 번 +와 를 바꾸어서 물체가 반대방향으로 회전하는지를 확인해 보십시오. 그리고 값을 0.2에서 1.0으로 바꾸어서 큰 값이 물체를 더 빨리 회전시키고, 작은 값은 물체를 천천히 회전시킨다는 것을 확인해 보십시오.
rtri+=0.2f; // 삼각형의 회전 각도 증가
rquad-=0.15f; // 사각형의 회전 각도 감소
return TRUE; // 프로그램은 계속된다 쭈욱~
}
최신글이 없습니다.
최신글이 없습니다.
댓글목록 0