Як зрабіць куб у OpenGL

Аўтар: Gregory Harris
Дата Стварэння: 12 Красавік 2021
Дата Абнаўлення: 1 Ліпень 2024
Anonim
Как сделать КУБИК на токарном станке
Відэа: Как сделать КУБИК на токарном станке

Задаволены

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