이전 섹션에서는 삼각형과 사각형을 색칠하는 방법을 배웠습니다. 이 단원에서는 좌표축을 중심으로 색상이 지정된 개체를 회전하는 방법을 배웁니다.
실제로 이전 섹션의 코드에 몇 줄만 추가하면 됩니다. 전체 루틴을 다시 작성해 보겠습니다. 무엇이 추가되었고, 무엇이 수정되었는지 알 수 있어 편리합니다.
두 개체의 회전을 제어하려면 두 변수를 추가합니다. 이 두 변수는 프로그램 시작 시 다른 변수 뒤에 추가됩니다(bool fullscreen=TRUE; 아래 두 줄). 이는 객체를 매우 정확하게 회전시킬 수 있는 부동 소수점 유형의 변수입니다. 부동 소수점 숫자에는 소수 자릿수가 포함되어 있습니다. 즉, 1, 2, 3...의 각도를 사용할 필요가 없습니다. 부동 소수점 숫자가 OpenGL 프로그래밍의 기초라는 것을 알게 될 것입니다. rtri라는 새로운 변수는 삼각형을 회전하는 데 사용되고 rquad는 사변형을 회전하는 데 사용됩니다.
바르
…
rtri : GLfloat; // 삼각형의 각도(신규)
rquad : GLfloat; // 사각형의 각도(신규)
…
그런 다음 glDraw()를 다음과 같이 수정합니다.
절차 glDraw();
시작하다
glClear(GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT) // 화면 및 깊이 버퍼 지우기
glLoadIdentity(); //현재 모델 관찰 행렬을 재설정합니다.
//다음 코드 줄은 새로운 코드입니다. glRotatef(Angle,X벡타,Y벡터,Z벡터)는 특정 축을 중심으로 객체를 회전시키는 역할을 합니다.
//이 명령은 다양한 용도로 사용됩니다. 각도는 일반적으로 객체가 회전하는 각도를 나타내는 변수입니다.
//세 개의 매개변수 X벡터, Y벡터, Z벡터가 함께 회전축의 방향을 결정합니다.
//예를 들어 (1,0,0)으로 표현되는 벡터는 X좌표축 1단위를 지나 오른쪽으로 향합니다.
//(-1,0,0)으로 설명되는 벡터는 X 좌표축의 1단위를 통과하지만 왼쪽 방향입니다.
//D. Michael Traub: X벡터, Y벡터 및 Z벡터에 대한 위의 설명을 제공합니다.
//X, Y, Z의 회전을 더 잘 이해하기 위해 몇 가지 예를 들어 보겠습니다.
//X축 - 테이블 톱을 사용하고 있습니다. 톱날 중앙의 축은 왼쪽에서 오른쪽으로 배치됩니다(OpenGL의 X축과 동일).
//날카로운 톱니는 X축을 중심으로 격렬하게 회전하며 겉보기에는 위쪽 또는 아래쪽으로 회전합니다.
//톱날이 회전하기 시작하는 방향에 따라 다릅니다. 이는 OpenGL에서 X축을 중심으로 무언가를 회전할 때와 동일한 상황입니다.
//(역자주: 지금 이 순간 모니터를 향해 얼굴을 대면 반드시 찔립니다^-^.)
//Y축 - 거대한 토네이도의 중심에 있고 토네이도의 중심이 땅에서 하늘을 향하고 있다고 가정해 보겠습니다(OpenGL의 Y축과 같습니다).
//쓰레기와 잔해물은 Y축을 중심으로 왼쪽에서 오른쪽으로 또는 오른쪽에서 왼쪽으로 격렬하게 회전합니다.
//이것은 OpenGL에서 Y축을 중심으로 무언가를 회전할 때와 같은 상황입니다.
//Z축 - 팬을 정면에서 보고 있습니다. 팬의 중심이 정확히 사용자를 향하고 있습니다(OpenGL의 Z축처럼).
//팬 블레이드는 Z축을 중심으로 시계 방향 또는 시계 반대 방향으로 격렬하게 회전합니다. 이는 OpenGL에서 Z축을 중심으로 무언가를 회전할 때와 동일한 상황입니다.
glTranslatef(-1.5, 0.0, -6.0); // 왼쪽으로 1.5단위 이동하여 화면 6.0으로 이동
//다음 코드 줄에서 rtri가 7이면 Y축을 중심으로 왼쪽에서 오른쪽으로 삼각형을 7만큼 회전합니다.
//매개변수 값을 변경하여 X축과 Y축을 중심으로 삼각형을 동시에 회전할 수도 있습니다.
glRotatef(rtri, 0.0, 1.0, 0.0); // Y축을 중심으로 삼각형 회전(신규)
//아래 코드에는 변경 사항이 없습니다. 색상이 있는 그라데이션 삼각형이 화면 왼쪽에 그려지고 Y축을 중심으로 왼쪽에서 오른쪽으로 회전됩니다.
glBegin(GL_TRIANGLES); // 삼각형 그리기
glColor3f(1.0, 0.0, 0.0); //현재 색상을 빨간색으로 설정
glVertex3f(0.0, 1.0, 0.0); // 상단 정점
glColor3f(0.0, 1.0, 0.0); //현재 색상을 녹색으로 설정
glVertex3f(-1.0, -1.0, 0.0) // 왼쪽 아래
glColor3f(0.0, 0.0, 1.0); //현재 색상을 파란색으로 설정
glVertex3f(1.0, -1.0, 0.0); // 오른쪽 아래
glEnd(); // 삼각형 그리기 끝
//아래 코드에서 또 다른 glLoadIdentity() 호출을 추가했음을 알 수 있습니다.
//모델 관측 행렬을 재설정하는 것이 목적입니다.
//재설정하지 않고 glTranslate를 직접 호출하면 예상치 못한 결과가 발생합니다.
//좌표축이 회전되었기 때문에 원하는 방향이 아닐 가능성이 높습니다.
//그래서 원래 객체를 좌우로 움직이려고 했던 것이 좌표축을 얼마나 회전시키느냐에 따라 위 아래가 될 수도 있습니다.
//glLoadIdentity()를 주석 처리한 후 어떤 일이 발생하는지 확인해보세요.
//모델 관찰 행렬을 재설정한 후 X, Y, Z 축이 모두 재설정되고 glTranslate를 호출합니다.
//이번에는 지난 강의처럼 3.0단위가 아닌 오른쪽으로 1.5단위만 이동했다는 것을 알 수 있습니다.
//장면을 재설정하면 초점이 장면 중앙(0.0)으로 돌아오기 때문입니다.
//이 방법을 사용하면 오른쪽으로 1.5단위만 이동하면 됩니다.
//새 위치로 이동할 때 X축을 중심으로 쿼드를 회전합니다. 사각형이 위아래로 회전합니다.
glLoadIdentity(); //모델 관찰 행렬 재설정
glTranslatef(1.5, 0.0, -6.0); // 오른쪽으로 1.5 단위 이동하여 화면 6.0으로 이동합니다.
glRotatef(rquad, 1.0, 0.0, 0.0); // X축을 중심으로 사변형을 회전합니다(신규).
glBegin(GL_QUADS); // 정사각형 그리기
glColor3f(0.6, 0.2, 2.0); //현재 색상을 보라색으로 설정
glVertex3f(-1.0, 1.0, 0.0); // 왼쪽 위
glVertex3f(1.0, 1.0, 0.0); // 오른쪽 위
glVertex3f(1.0, -1.0, 0.0) // 왼쪽 아래
glVertex3f(-1.0, -1.0, 0.0); // 오른쪽 아래
glEnd(); // 정사각형 그리기 끝
//다음 두 줄은 새로운 줄입니다.
//rtri와 rquad를 컨테이너로 상상한다면,
//그런 다음 프로그램 시작 부분에서 컨테이너(rtri 및 rquad)를 만들었습니다.
//컨테이너가 생성되면 비어 있습니다.
//아래 코드의 첫 번째 줄은 컨테이너에 0.2를 추가합니다.
//따라서 이전 코드를 실행할 때마다 여기서 rtri 컨테이너의 값은 0.2씩 증가합니다.
//다음 줄은 rquad 컨테이너의 값을 0.15만큼 줄입니다.
//마찬가지로 이전 코드를 실행할 때마다 rquad 컨테이너의 값은 여기서 0.15씩 감소합니다.
//낙하하면 결국 개체가 성장 방향의 반대 방향으로 회전하게 됩니다.
rtri := rtri + 0.2; // 삼각형의 회전 변수 증가(신규)
rquad := rquad - 0.15; // 사각형의 회전 변수를 줄입니다(신규)
끝;