OpenGL에서 큐브를 만드는 방법

작가: Gregory Harris
창조 날짜: 12 4 월 2021
업데이트 날짜: 1 칠월 2024
Anonim
그래픽스 14주차 1교시: Cube에 텍스쳐 입히기 (1/2) #OpenGL
동영상: 그래픽스 14주차 1교시: Cube에 텍스쳐 입히기 (1/2) #OpenGL

콘텐츠

OpenGL은 단순한 모양에서 복잡한 3D 이미지를 만들 수 있는 3D 프로그래밍 도구입니다. 이 기사에서는 그의 도움으로 3차원으로 회전할 수 있는 간단한 정육면체를 그리는 방법을 배웁니다!

단계

파트 1/3: 초기 설치

  1. 1 OpenGL을 설치합니다. 컴퓨터에 OpenGL을 설치하는 방법에 대한 자습서로 시작하십시오. OpenGL과 C 컴파일러가 이미 있는 경우 이 단계를 건너뛰고 다음 단계로 넘어갈 수 있습니다.
  2. 2 문서를 만듭니다. 즐겨 사용하는 코드 편집기에서 새 파일을 만들고 mycube.c로 저장합니다.
  3. 3 #include를 추가합니다. 다음은 필요한 기본 #include 지시문입니다. 다른 운영 체제에 대한 지시문은 다르므로 프로그램이 보편적이고 모든 시스템에서 실행할 수 있도록 모든 것을 선택해야 함을 기억하는 것이 중요합니다.

      // 포함 #include stdio.h> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #else #include GL / glut.h> #endif

  4. 4 기능적 프로토타입 및 전역을 추가합니다. 다음 단계는 기능적 프로토타입을 선언하는 것입니다.

      // 함수형 프로토타입 void display(); 무효 특수 키(); // 전역 변수 double rotate_y = 0; 이중 회전_x = 0;

  5. 5 메인() 함수를 정의합니다.

      int main (int argc, char * argv []) // GLUT 초기화 및 사용자 정의 매개변수 처리 glutInit (& argc, argv); // 더블 버퍼링, Z 버퍼링 및 트루 컬러를 지원하는 창 요청 glutInitDisplayMode (GLUT_DOUBLE

파트 2/3: 디스플레이() 함수

  1. 1 표시() 함수의 목적을 이해합니다. 큐브를 렌더링하는 모든 작업은 이 함수의 취약한 라인에 해당됩니다. 일반적인 아이디어는 다음과 같습니다. 큐브의 6개의 개별 면을 그려 각각의 위치에 배치합니다.
    • 각 면에 대해 네 모서리를 정의하면 OpenGL이 모서리를 선으로 연결하고 선택한 색상으로 채웁니다. 이 작업을 수행하는 방법은 아래에 설명되어 있습니다.
  2. 2 glClear() 함수를 추가합니다. 우선, 이 기능으로 작업할 때 필요합니다. 선명한 색상 및 z 버퍼... 이것이 없으면 이전 그림이 새 그림 아래에 표시되고 프로그램에서 그린 개체가 잘못 배치됩니다.

      void display() // 화면과 Z 버퍼 지우기 glClear (GL_COLOR_BUFFER_BIT

    • 마지막 두 줄에 주목하세요. 이것들은 기능들입니다 gl플러시(); 그리고 glutSwapBuffers();, 위에서 설명한 이중 버퍼링의 효과를 제공합니다.

3/3부: 프로그램 상호 작용

  1. 1 specialKeys() 함수를 추가합니다. 원칙적으로 모든 것이 거의 준비되었지만 큐브는 그려지기만 하고 회전하지 않습니다. 이렇게 하려면 생성해야 합니다. 특수키() 함수, 화살표 키를 눌러 큐브를 회전할 수 있습니다!
    • 이 함수를 위해 전역 변수 rotate_x 및 rotate_y가 선언되었습니다. 왼쪽 및 오른쪽 화살표 키를 누르면 rotate_y 값이 5도씩 증가하거나 감소합니다. rotate_x의 값은 같은 방식으로 변경되지만 이번에는 위쪽 및 아래쪽 화살표 키를 눌러 변경됩니다.
    • void specialKeys (int key, int x, int y) {// 오른쪽 화살표 - (key == GLUT_KEY_RIGHT) rotate_y + = 5; // 왼쪽 화살표 - 회전을 5도 감소 else if (key == GLUT_KEY_LEFT) rotate_y - = 5; else if (키 == GLUT_KEY_UP) rotate_x + = 5; else if (키 == GLUT_KEY_DOWN) 회전_x - = 5; // 화면 새로 고침 요청 glutPostRedisplay(); }

  2. 2 glRotate()를 추가합니다. 마지막으로 할 일은 개체를 회전할 수 있는 선을 추가하는 것입니다. 기능으로 돌아가기 표시하다 () FRONT 측면에 대한 설명 앞에 다음을 추가합니다.

      // 변환 재설정 glLoadIdentity(); // 사용자가 변경하면 회전합니다.rotate_x 및 rotate_y 값 glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0.0, 1.0, 0.0); // 멀티컬러 면 - FRONT ....

    • 구문 gl회전()이는 glColor3f() 및 glVertex3f()의 구문과 유사하지만 항상 4개의 매개변수가 필요합니다. 첫 번째는 회전 각도(도)입니다. 다음 세 개는 x, y, z 순서로 회전이 발생하는 축입니다. 지금은 x와 y의 두 축을 따라 큐브를 회전해야 합니다.
    • 프로그램에서 정의하는 모든 변환에는 유사한 행이 필요합니다. 기본적으로 x축을 따른 객체의 회전을 rotate_x 값의 변경으로 나타내고 y축을 따른 회전을 rotate_y 값의 변경으로 나타냅니다. 그러나 OpenGL은 모든 것을 하나의 변환 매트릭스로 묶습니다. display를 호출할 때마다 변환 행렬을 만들고 glLoadIdentity() 매번 새로운 매트릭스로 시작할 수 있습니다.
    • 사용했을 수 있는 다른 변환 함수는 glTranslatef() 및 glScalef()입니다. 객체의 크기를 조정하고 크기를 조정하는 데 x, y 및 z 값의 세 가지 매개변수만 필요하다는 점을 제외하고는 glRotatef()와 유사합니다.
    • 세 가지 변형이 모두 하나의 개체에 적용될 때 모든 것이 올바르게 표시되도록 하려면 적절한 순서로 변형을 설정해야 합니다. 즉, glTranslate, glRotate, glScale - 그리고 절대 그렇지 않습니다. OpenGL은 프로그램을 아래에서 위로 읽어 객체를 변환합니다. 이것을 더 잘 이해하려면 OpenGL이 표시된 순서대로(위에서 아래로) 모든 변환을 적용한 경우 1x1x1 큐브가 어떻게 보일지 상상한 다음, 아래에서 위로 지침을 읽어 OpenGL이 큐브를 처리하는 방법에 대해 생각하십시오.
  3. 3 다음 명령을 추가하여 큐브를 x 및 y 방향으로 두 번 크기 조정하고, y축에서 큐브를 180도 회전하고, x축에서 큐브를 0.1 이동합니다. 이전에 제공된 glRotate() 명령을 포함하여 모든 관련 명령이 올바른 순서인지 확인하십시오. 실수하는 것이 두려우면 기사 마지막 부분에 있는 프로그램의 최종 버전을 참조하세요.

      // 더 많은 변환 glTranslatef (0.1, 0.0, 0.0); gl회전(180, 0.0, 1.0, 0.0); glScalef(2.0, 2.0, 0.0);

  4. 4 코드를 컴파일하고 실행합니다. 컴파일러로 gcc를 사용한다고 가정해 보겠습니다. 터미널에 다음 명령을 입력하세요.

      Linux: gcc cube.c -o cube -lglut -lGL ./ mycube Mac: gcc -o foo foo.c -framework GLUT -framework OpenGL ./ mycube Windows: gcc -Wall -ofoo foo.c -lglut32cu - lglu32 -lopengl32 ./마이큐브

  5. 5 최종 코드를 확인하십시오. 다음은 댓글을 번역하지 않는 기사 작성자가 작성한 최종 코드입니다.

      // // 파일: mycube.c // 작성자: Matt Daisley // 생성: 2012-04-25 // 프로젝트: Make a Cube in OpenGL용 소스 코드 // 설명: OpenGL 창 생성 및 3D 큐브 그리기 / / 사용자가 화살표 키를 사용하여 회전할 수 있음 // // 컨트롤: 왼쪽 화살표 - 왼쪽으로 회전 // 오른쪽 화살표 - 오른쪽으로 회전 // 위쪽 화살표 - 위쪽으로 회전 // 아래쪽 화살표 - 아래쪽으로 회전 // ------ -------------------------------------------------- - // 포함 // ------------------------------------------- - -------------- #include stdio.h> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #else # 포함 GL / glut.h> #endif // ------------------------------------------ - ------------------ // 함수 프로토타입 // ------------------------- - -------------------------------- 무효 표시(); 무효 특수 키(); // ------------------------------------------------ ---------- // 전역 변수 // ---------------------------------- ------------------------ 이중 회전_y = 0; 이중 회전_x = 0; // ------------------------------------------------ ---------- // display () 콜백 함수 // ------------------------------- --------------------------- void display () // 화면 및 Z 버퍼 지우기 glClear (GL_COLOR_BUFFER_BIT // ------ -------------------------------------------------- - // specialKeys() 콜백 함수 // ------------------------------------------- - ------------------ void specialKeys (int key, int x, int y) {// 오른쪽 화살표 - (key == GLUT_KEY_RIGHT) rotate_y + = 5; // 왼쪽 화살표 - 회전을 5도만큼 감소 else if (key == GLUT_KEY_LEFT) rotate_y - = 5; else if (key == GLUT_KEY_UP) rotate_x + = 5; else if (key == GLUT_KEY_DOWN) rotate_x - = 5; // 디스플레이 업데이트 요청 glutPostRedisplay();} // ----------------------------------- - ---------------------- // 메인() 함수 // ------------------- - -------------------------------------- int main (int argc, char * argv [ ] ) GLUT_RGB