Як зробити куб в OpenGL

Автор: Gregory Harris
Дата Створення: 12 Квітень 2021
Дата Оновлення: 1 Липня 2024
Anonim
Qt+OpenGL.  Основы, Вращение куба. Игра в 3D: Часть 1
Відеоролик: Qt+OpenGL. Основы, Вращение куба. Игра в 3D: Часть 1

Зміст

OpenGL - це інструмент 3D-програмування, що дозволяє створювати складні тривимірні зображення з простих форм. З цієї статті ви дізнаєтеся, як намалювати з його допоможемо простий куб, який можна обертати в в трьох вимірах!

кроки

Частина 1 з 3: Первісна установка

  1. 1 Встановіть OpenGL. Почніть з керівництва по установці OpenGL на ваш комп'ютер. Якщо OpenGL і компілятор С у вас вже є, можете пропустити цей крок і перейти до наступного.
  2. 2 Створіть документ. Створіть новий файл в своєму улюбленому редакторі коду і збережіть його як mycube.c
  3. 3 Додайте #includes. Ось основні директиви #include, які вам знадобляться. Важливо пам'ятати, що директиви для різних операційних систем - різні, а тому вибрати потрібно все, щоб програма була універсальною і її можна було запустити в будь-якій системі.

      // Includes #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 (); void specialKeys (); // Глобальні змінні double rotate_y = 0; double rotate_x = 0;

  5. 5 Задайте функцію main ().

      int main (int argc, char * argv []) // ініціалізувавши GLUT і обробляємо призначені для користувача параметри glutInit (& argc, argv); // запитуваний вікно з підтримкою подвійної буферизації, z-буферизації і колірної схеми True Color glutInitDisplayMode (GLUT_DOUBLE

Частина 2 з 3: Функція display ()

  1. 1 Зрозумійте призначення функції display (). Вся робота по отрисовке куба ляже на тендітні рядки цієї функції. Ідея в цілому така: ви намалюєте шість окремих граней куба і розмістіть їх у відповідних позиціях.
    • Для кожної грані ви задасте чотири кути, а OpenGL з'єднає їх лініями і виконає заливку обраним вами кольором. Нижче буде розказано, як це зробити.
  2. 2 Додайте функцію glClear (). Насамперед, працюючи з цією функцією, нам треба очистити колір і z-буфер. Без цього під новим малюнком буде виднітися старий, а намальовані програмою об'єкти будуть розташовані неправильно.

      void display () // Очищаємо екран і z-буфер glClear (GL_COLOR_BUFFER_BIT

    • Зверніть увагу на два останні рядки. це функції glFlush (); і glutSwapBuffers ();, Що дають ефект подвійний буферизації, про який йшлося вище.

Частина 3 з 3: Інтерактивність програми

  1. 1 Додайте функцію specialKeys (). В принципі, все вже майже готове, однак куб тільки промальовується і не обертається. Для цього треба створити функцію specialKeys (), Яка дозволить обертати куб, натискаючи на клавіші-стрілки!
    • Саме заради цієї функції були оголошені глобальні змінні rotate_x і rotate_y. Коли ви будете натискати на клавіші-стрілки «вліво» і «вправо», значення rotate_y буде збільшуватися або зменшуватися на п'ять градусів. Аналогічним чином будемо мінятися і значення rotate_x, але вже при натисканні на клавіші-стрілки «вгору» і «вниз».
    • void specialKeys (int key, int x, int y) {// Права стрілка - збільшення обертання на 5 градусів if (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 (); }

  2. 2 Додайте glRotate (). Останнє, що ми зробимо, - додамо рядок, яка дозволить нам обертати об'єкт. Поверніться до функції display () і перед описом ПЕРЕДНІЙ боку додайте:

      // Скидання трансформацій glLoadIdentity (); // Обертання при зміні користувачем значень rotate_x і rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0.0, 1.0, 0.0); // Багатобарвна сторона - ПЕРЕДНЯЯ ....

    • Зверніть увагу, що синтаксис glRotatef (), Який схожий з синтаксисом glColor3f () і glVertex3f (), але завжди вимагає вказівки чотирьох параметрів. Перший - кут обертання в градусах. Наступні три - осі, за якими йде обертання, в порядку x, y, z. Поки що нам потрібно обертати куб по двох осях, x і у.
    • Для всіх трансформацій, які ми задаємо в програмі, потрібні аналогічні рядки. По суті, ми представляємо обертання об'єкта по осі х як зміна значення rotate_x, а обертання по осі у - як зміна значення rotate_y. Втім, OpenGL об'єднає всі в одну матрицю трансформації. Всякий раз, викликаючи функцію display, ви будете створювати матрицю трансформації, і glLoadIdentity () дозволить починати кожен раз з новою матриці.
    • Інші функції трансформації, яким ви могли скористатися, - це glTranslatef () і glScalef (). Вони аналогічні glRotatef (), за винятком того, що вимагають лише трьох параметрів: значення x, y і z для зміни і масштабування об'єкта.
    • Щоб все відображалося правильно, коли всі три трансформації застосовані до одного об'єкту, потрібно задавати трансформації у відповідному порядку, а саме glTranslate, glRotate, glScale - і ніколи інакше. OpenGL трансформує об'єкт, читаючи програму від низу до верху. Щоб краще це зрозуміти, уявіть, як куб 1x1x1 буде виглядати після всіх трансформацій, якби OpenGL застосовував їх у тому порядку, як ті вказані (зверху вниз), а потім подумайте, як OpenGL обробить куб, читаючи інструкції від низу до верху.
  3. 3 Додайте наступні команди для двократного масштабування куба по осях х та у, для обертання куба на 180 градусів по осі у, а також для переміщення куба на 0,1 по осі х. Переконайтеся, що всі відповідні команди, включаючи раніше задані команди glRotate (), вказані в правильному порядку. Якщо боїтеся помилитися, подивіться фінальну версію програми в кінці статті.

      // Інші трансформації glTranslatef (0.1, 0.0, 0.0); glRotatef (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 ./ mycube

  5. 5 Перевірте фінальний код. Ось фінальний код, створений автором статті, в якому не перекладені коментарі.

      // // File: mycube.c // Author: Matt Daisley // Created: 4/25/2012 // Project: Source code for Make a Cube in OpenGL // Description: Creates an OpenGL window and draws a 3D cube / / That the user can rotate using the arrow keys // // Controls: Left Arrow - Rotate Left // Right Arrow - Rotate Right // Up Arrow - Rotate Up // Down Arrow - Rotate Down // ------ -------------------------------------------------- - // Includes // ------------------------------------------- --------------- #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 // --------------------------------------- ------------------- // Function Prototypes // ------------------------- --------------------------------- void display (); void specialKeys (); // ------------------------------------------------ ---------- // Global Variables // ---------------------------------- ------------------------ double rotate_y = 0; double rotate_x = 0; // ------------------------------------------------ ---------- // display () Callback function // ------------------------------- --------------------------- void display () // Clear screen and Z-buffer glClear (GL_COLOR_BUFFER_BIT // ------ -------------------------------------------------- - // specialKeys () Callback Function // --------------------------------------- ------------------- void specialKeys (int key, int x, int y) {// Right arrow - increase rotation by 5 degree if (key == GLUT_KEY_RIGHT) rotate_y + = 5; // Left arrow - decrease rotation by 5 degree 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; // Request display update glutPostRedisplay ();} // ----------------------------------- ----------------------- // main () function // ------------------- --------------------------------------- int main (int argc, char * argv [ ]) GLUT_RGB