Как да направите куб в OpenGL (със снимки)

Съдържание:

Как да направите куб в OpenGL (със снимки)
Как да направите куб в OpenGL (със снимки)

Видео: Как да направите куб в OpenGL (със снимки)

Видео: Как да направите куб в OpenGL (със снимки)
Видео: Установка Linux Ubuntu 16.04 в VirtualBox на Windows 2024, Април
Anonim

OpenGL е мощен инструмент за 3D програмиране, използван за изготвяне на сложни триизмерни сцени от прости примитиви. Тази статия ще ви научи как да нарисувате прост куб, който можете да завъртите, за да видите в три измерения!

За този проект ще ви е необходим редактор на код и известни познания по програмиране на C.

Стъпки

Част 1 от 3: Първоначална настройка

1994315 1 1
1994315 1 1

Стъпка 1. Инсталирайте OpenGL За да започнете, следвайте тези стъпки, за да инсталирате OpenGL на вашата система

Ако вече имате OpenGL, както и инсталиран съвместим C компилатор, можете да пропуснете тази стъпка и да преминете към следващата.

1994315 2 1
1994315 2 1

Стъпка 2. Създайте документа

Създайте нов файл в любимия си редактор на кодове и го запазете като mycube.c

1994315 3 1
1994315 3 1

Стъпка 3. Добавете #includes

Това са основните включвания, които ще ви трябват за вашата програма. Важно е да се разбере, че всъщност има различни включвания, необходими за различните операционни системи. Не забравяйте да включите всичко това, за да сте сигурни, че вашата програма е универсална и може да работи за всеки потребител.

    // Включва #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif

1994315 4 1
1994315 4 1

Стъпка 4. Добавете прототипи на функции и глобални променливи

Следващата ви стъпка е да декларирате някои функционални прототипи.

    // Функция Прототипи void display (); void specialKeys (); // Глобални променливи double rotate_y = 0; двойно завъртане_x = 0;

1994315 5 1
1994315 5 1

Стъпка 5. Настройте функцията main ()

    int main (int argc, char* argv ) {// Инициализира GLUT и обработва потребителските параметри glutInit (& argc, argv); // Искане на двоен буфериран прозорец с истински цвят със Z-буфер glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

  • Това изявление създава вашата среда. Голямо нещо, което трябва да запомните, когато пишете OpenGL програми, е, че трябва да поискате всичко. Това изисква да имате по -добро разбиране за това как работи вашата програма и какво трябва да включите, за да получите функционалността, която искате. В този ред ще настроите дисплея с двойно буфериране, RGB цвят и Z-буфер.
  • Двойно буфериране е техника, използвана в графичните програми за елиминиране на проблем, който възниква поради начина, по който изображенията се изтеглят на екрана. Всеки път, когато прерисувате сцената, дисплеят първо трябва да бъде изтрит, след което ще бъде изтеглена новата информация. Без двойно буфериране ще наблюдавате трептящ ефект, тъй като екранът се изтрива и прекроява многократно.
  • Този проблем се решава чрез добавяне на втори буфер, към който да се изтегли. С този метод изображение се изтегля към първия буфер и този буфер ви се показва. Следващият кадър ще бъде изтеглен към втория буфер и когато това стане, двата буфера ще сменят местата. Веднага ще видите втория буфер, но скрит от нас, първият буфер се изтрива и прекроява с третия кадър, който ще бъде заменен, когато приключи.
  • Искате също да активирате RGB цвят система във вашия прозорец.
  • Z-буфериране е начинът да получите 3D ефектите, които искате. OpenGL използва триизмерна координатна система с оси x, y и z. За да се даде ефект, че обектът е по -близо до вас, позицията му по оста z се увеличава, но за да изглежда по -далеч, позицията му по оста z намалява.
1994315 6 1
1994315 6 1

Стъпка 6. Създайте прозореца

Следващата стъпка е да създайте прозореца в рамките на който ще нарисувате куба. В този урок прозорецът се нарича "Awesome Cube".

    // Създаване на прозорец glutCreateWindow ("Awesome Cube");

1994315 7 1
1994315 7 1

Стъпка 7. Активирайте дълбочинния тест

OpenGL е строг език, тъй като не предполага, че са активирани специални функции. За да може вашата програма да се показва правилно в триизмерни, използвайки Z-буфера, който разгледахте по-рано, трябва активирайте дълбочинния тест. Докато продължавате да изследвате OpenGL, ще откриете много функции, които ще трябва да активирате, включително осветление, текстури, облицовка и много други.

    // Активиране на теста за дълбочина на Z-буфера glEnable (GL_DEPTH_TEST);

1994315 8 1
1994315 8 1

Стъпка 8. Добавете функции за обратно повикване

Ето функциите за обратно повикване, за които сте писали прототипите по -рано. Всеки път през главния цикъл тези функции ще се извикват. Функцията за показване прекроява сцената въз основа на всички промени в променливите, направени от предишното повикване. Функцията specialKeys ни позволява да взаимодействаме с програмата.

    // Функции за обратно повикване glutDisplayFunc (дисплей); glutSpecialFunc (specialKeys);

1994315 9 1
1994315 9 1

Стъпка 9. Стартирайте MainLoop

Това ще извика основната функция, докато не затворите програмата, за да позволите анимации и взаимодействие с потребителя.

    // Предава контрол на GLUT за събития glutMainLoop (); // връщане към OS връщане 0; }

Част 2 от 3: Функцията на дисплея ()

1994315 10 1
1994315 10 1

Стъпка 1. Разберете целта на тази функция

Цялата работа по рисуването на вашия куб ще се извърши в тази функция. Общата идея зад вашия куб е да нарисувате всичките шест страни поотделно и да ги поставите в подходящото положение.

Концептуално всяка страна ще бъде нарисувана чрез дефиниране на четирите ъгъла и оставяне на OpenGL да свърже линиите и да я запълни с определен от вас цвят. По -долу са стъпките за това

1994315 11 1
1994315 11 1

Стъпка 2. Добавете glClear ()

Първата стъпка, която трябва да направите в тази функция, е да изчистете цвета и Z буфера. Без тези стъпки старите чертежи все още могат да се виждат под новите чертежи и начертаните обекти няма да са на правилното място на екрана.

    void display () {// Изчистване на екрана и Z-буфер glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

1994315 12 1
1994315 12 1

Стъпка 3. Добавете glBegin () и glEnd ()

OpenGL определя обектите като комбинации от различни многоъгълници. Използвайки glBegin () команда, ефективно поставяте молив, който ще нарисува форма. За да повдигнете молива и да започнете нова форма, трябва да използвате glEnd () команда. В този урок ще използвате GL_POLYGON, за да нарисувате всяка страна на куба, но е възможно да използвате други опции за параметри, като GL_LINE, GL_QUAD или GL_TRIANGLE, за да създадете други форми.

  • Тук ще започнете с предната част на вашия куб. По -късно ще добавите цвят към всички 6 страни.
  • // Многоцветна страна - FRONT glBegin (GL_POLYGON); // Върховете ще бъдат добавени в следващата стъпка glEnd ();

1994315 13 1
1994315 13 1

Стъпка 4. Добавете glVertex3f ()

След като сте заявили, че искате да започнете своя многоъгълник, трябва да го направите определят върховете на обекта. glVertex има множество форми в зависимост от това какво искате да направите с вашия обект.

  • Първото е в колко измерения работите. Горните 3 в glVertex3f казват, че рисувате в 3 измерения. Възможно е също така да се работи в 2 или 4 измерения. Горното f в glVertex3f казва, че работите с числа с плаваща запетая. Можете също да използвате къси панталони, цели числа или двойки.
  • Забележете, че тези точки са дефинирани в a обратно на часовниковата стрелка начин. Това не е много важно в момента, но когато започнете да работите с осветление, текстури и облицовка, това ще стане изключително важно, така че придобийте навика да определяте точките си обратно на часовниковата стрелка сега.
  • Add добавете върховете между редовете glBegin () и glEnd ().
  • // Многоцветна страна - FRONT glBegin (GL_POLYGON); glVertex3f (-0,5, -0,5, -0,5); // P1 glVertex3f (-0,5, 0,5, -0,5); // P2 glVertex3f (0.5, 0.5, -0.5); // P3 glVertex3f (0.5, -0.5, -0.5); // P4 glEnd ();

1994315 14 1
1994315 14 1

Стъпка 5. Добавете glColor3f ()

glColor работи по подобен начин на glVertex. Можете да дефинирате точки като шорти, цели числа, двойни или плаващи. Всеки цвят има стойност от 0 до 1. Всички 0 правят точката черна, а всички 1 ще направят точката бяла. 3 в glColor3f () се отнася до цветовата система RGB без алфа канал. Алфата на един цвят определя неговата прозрачност. За да промените алфа нивото, използвайте glColor4f (), като последният параметър е стойност от 0 до 1 за непрозрачно до прозрачно.

  • Когато извикате glColor3f () всеки връх, изчертан от тази точка нататък, ще бъде с този цвят. Следователно, ако искате и четирите върха да бъдат червени, просто задайте цвета веднъж по всяко време преди командите glVertex3f () и всички върхове ще бъдат червени.
  • Предната страна, определена по -долу, показва как да се дефинира нов цвят за всеки връх. Когато направите това, можете да видите интересно свойство на цветовете на OpenGL. Тъй като всеки връх на многоъгълника има свой собствен цвят, OpenGL автоматично ще смеси цветовете! Следващата стъпка ще покаже как да присвоите четири върха със същия цвят.
  • // Многоцветна страна - FRONT glBegin (GL_POLYGON); glColor3f (1.0, 0.0, 0.0); glVertex3f (0,5, -0,5, -0,5); // P1 е червен glColor3f (0.0, 1.0, 0.0); glVertex3f (0,5, 0,5, -0,5); // P2 е зелен glColor3f (0.0, 0.0, 1.0); glVertex3f (-0,5, 0,5, -0,5); // P3 е син glColor3f (1.0, 0.0, 1.0); glVertex3f (-0,5, -0,5, -0,5); // P4 е лилаво glEnd ();

1994315 15 1
1994315 15 1

Стъпка 6. Дръжте другите страни

Разберете какво ще бъде местоположението на всеки връх за останалите пет страни на куба, но за по -голяма простота те са изчислени за вас и са включени в финална функция display () По-долу.

    // Бяла страна - НАЗАД glBegin (GL_POLYGON); glColor3f (1.0, 1.0, 1.0); glVertex3f (0,5, -0,5, 0,5); glVertex3f (0,5, 0,5, 0,5); glVertex3f (-0,5, 0,5, 0,5); glVertex3f (-0,5, -0,5, 0,5); glEnd (); // Лилава страна - НАДЯСНО glBegin (GL_POLYGON); glColor3f (1.0, 0.0, 1.0); glVertex3f (0,5, -0,5, -0,5); glVertex3f (0,5, 0,5, -0,5); glVertex3f (0,5, 0,5, 0,5); glVertex3f (0,5, -0,5, 0,5); glEnd (); // Зелена страна - НАЛЯВО glBegin (GL_POLYGON); glColor3f (0.0, 1.0, 0.0); glVertex3f (-0,5, -0,5, 0,5); glVertex3f (-0,5, 0,5, 0,5); glVertex3f (-0,5, 0,5, -0,5); glVertex3f (-0,5, -0,5, -0,5); glEnd (); // Синя страна - TOP glBegin (GL_POLYGON); glColor3f (0.0, 0.0, 1.0); glVertex3f (0,5, 0,5, 0,5); glVertex3f (0,5, 0,5, -0,5); glVertex3f (-0,5, 0,5, -0,5); glVertex3f (-0,5, 0,5, 0,5); glEnd (); // Червена страна - BOTTOM glBegin (GL_POLYGON); glColor3f (1.0, 0.0, 0.0); glVertex3f (0,5, -0,5, -0,5); glVertex3f (0,5, -0,5, 0,5); glVertex3f (-0,5, -0,5, 0,5); glVertex3f (-0,5, -0,5, -0,5); glEnd (); glFlush (); glutSwapBuffers (); }

  • Искаме също така да добавим два последни реда код за тази функция. Това са glFlush ();

    и glutSwapBuffers ();

    които ни дават двойния буфериращ ефект, за който научихте по-рано.

Част 3 от 3: Интерактивност на потребителя

1994315 16 1
1994315 16 1

Стъпка 1. Добавете specialKeys ()

Почти сте готови, но в момента можете да нарисувате куб, но нямате начин да го завъртите. За да направите това, ще го направите създайте специален ключ () функция, която ни позволява да натискаме клавишите със стрелки и да завъртаме куба!

  • Тази функция е причината да декларирате глобалните променливи rotate_x и rotate_y. Когато натиснете клавишите със стрелки надясно и наляво, rotate_y ще се увеличи или намали с 5 градуса. По същия начин, когато натиснете клавишите със стрелки нагоре и надолу, rotate_x ще се промени съответно.
  • void specialKeys (int key, int x, int y) {// Стрелка надясно - увеличаване на въртенето с 5 градуса, ако (key == GLUT_KEY_RIGHT) rotate_y += 5; // Стрелка наляво - намалете завъртането с 5 градуса иначе if (key == GLUT_KEY_LEFT) rotate_y - = 5; иначе ако (ключ == GLUT_KEY_UP) завъртане_x += 5; иначе ако (ключ == GLUT_KEY_DOWN) завъртане_x -= 5; // Искане на актуализация на дисплея glutPostRedisplay (); }

1994315 17 1
1994315 17 1

Стъпка 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 (), но винаги изисква 4 параметъра. Първият параметър е степента на въртене, която трябва да се приложи. Следващите три параметъра определят коя ос да се върти, като първата е оста x, втората е оста y, а третата е оста z. В момента трябва само да се въртите около оста x и y.
  • Всички трансформации, които пишете във вашата програма, се нуждаят от редове, подобни на тези. Концептуално можете да мислите за това като завъртане на вашия обект около оста x с размера, определен от rotate_x и след това завъртане около оста y чрез rotate_y. OpenGL обаче комбинира всички тези изявления в една матрична трансформация. Всеки път, когато извиквате функцията за показване, изграждате матрица за трансформация и glLoadIdentity () гарантира, че ще започнете с нова матрица при всяко преминаване.
  • Другите функции за трансформация, които можете да приложите, са glTranslatef () и glScalef (). Тези функции са подобни на glRotatef () с изключение на това, че приемат само 3 параметъра, x, y и z сумите за превод или мащабиране на обекта.
  • За да получите правилния ефект при прилагане на трите трансформации към един обект, трябва да ги приложите в правилния ред. Винаги ги пишете в реда glTranslate, glRotate, след това glScale. OpenGL по същество прилага трансформациите по начин отдолу нагоре. За да разберете това, опитайте се да си представите как би изглеждал прост куб 1x1x1 с трансформациите, ако OpenGL ги приложи отгоре надолу и ако OpenGL ги приложи отдолу нагоре.
1994315 18 1
1994315 18 1

Стъпка 3. Добавете следните команди, за да мащабирате куба с 2 по оста x, 2 по оста y, завъртете куба на 180 градуса около оста y и преведете куба с 0,1 по оста x

Не забравяйте да подредите тези, както и предишните команди glRotate () в правилния ред, както е описано по -горе. (Ако не сте сигурни, това се прави в крайния код в края на урока.)

    // Други трансформации glTranslatef (0.1, 0.0, 0.0); glRotatef (180, 0.0, 1.0, 0.0); glScalef (2.0, 2.0, 0.0);

1994315 19 1
1994315 19 1

Стъпка 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

1994315 20 1
1994315 20 1

Стъпка 5. Проверете пълния си код

Трябва да е така:

    // // Файл: mycube.c // Автор: Matt Daisley // Създаден: 25.04.2012 г. // Проект: Изходен код за Make a Cube в OpenGL // Описание: Създава прозорец на OpenGL и изчертава 3D куб/ / Че потребителят може да се върти с помощта на клавишите със стрелки // // Контроли: Стрелка наляво -Завъртане наляво // Стрелка надясно -Завъртане надясно // Стрелка нагоре -Завъртане нагоре // Стрелка надолу -Завъртане надолу // ------ -------------------------------------------------- -- // Включва // ------------------------------------------- --------------- #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif // ------------- --------------------------------------------- // Функционални прототипи / / ------------------------------------------------- --------- празен дисплей (); void specialKeys (); // ------------------------------------------------ ---------- // Глобални променливи // ---------------------------------- ------------------------ двойно завъртане_y = 0; двойно завъртане_x = 0; // ------------------------------------------------ ---------- // display () Функция за обратно повикване // ------------------------------- --------------------------- void display () {// Изчистване на екрана и Z-буфер glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Нулиране на трансформации glLoadIdentity (); // Други трансформации // glTranslatef (0.1, 0.0, 0.0); // Не е включено // glRotatef (180, 0.0, 1.0, 0.0); // Не е включено // Завъртане, когато потребителят промени rotate_x и rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0.0, 1.0, 0.0); // Други трансформации // glScalef (2.0, 2.0, 0.0); // Не е включено // Многоцветна страна - FRONT glBegin (GL_POLYGON); glColor3f (1.0, 0.0, 0.0); glVertex3f (0,5, -0,5, -0,5); // P1 е червен glColor3f (0.0, 1.0, 0.0); glVertex3f (0,5, 0,5, -0,5); // P2 е зелен glColor3f (0.0, 0.0, 1.0); glVertex3f (-0,5, 0,5, -0,5); // P3 е син glColor3f (1.0, 0.0, 1.0); glVertex3f (-0,5, -0,5, -0,5); // P4 е лилаво glEnd (); // Бяла страна - НАЗАД glBegin (GL_POLYGON); glColor3f (1.0, 1.0, 1.0); glVertex3f (0,5, -0,5, 0,5); glVertex3f (0,5, 0,5, 0,5); glVertex3f (-0,5, 0,5, 0,5); glVertex3f (-0,5, -0,5, 0,5); glEnd (); // Лилава страна - НАДЯСНО glBegin (GL_POLYGON); glColor3f (1.0, 0.0, 1.0); glVertex3f (0,5, -0,5, -0,5); glVertex3f (0,5, 0,5, -0,5); glVertex3f (0,5, 0,5, 0,5); glVertex3f (0,5, -0,5, 0,5); glEnd (); // Зелена страна - НАЛЯВО glBegin (GL_POLYGON); glColor3f (0.0, 1.0, 0.0); glVertex3f (-0,5, -0,5, 0,5); glVertex3f (-0,5, 0,5, 0,5); glVertex3f (-0,5, 0,5, -0,5); glVertex3f (-0,5, -0,5, -0,5); glEnd (); // Синя страна - TOP glBegin (GL_POLYGON); glColor3f (0.0, 0.0, 1.0); glVertex3f (0,5, 0,5, 0,5); glVertex3f (0,5, 0,5, -0,5); glVertex3f (-0,5, 0,5, -0,5); glVertex3f (-0,5, 0,5, 0,5); glEnd (); // Червена страна - BOTTOM glBegin (GL_POLYGON); glColor3f (1.0, 0.0, 0.0); glVertex3f (0,5, -0,5, -0,5); glVertex3f (0,5, -0,5, 0,5); glVertex3f (-0,5, -0,5, 0,5); glVertex3f (-0,5, -0,5, -0,5); glEnd (); glFlush (); glutSwapBuffers (); } // ----------------------------------------------- ----------- // specialKeys () Функция за обратно повикване // ------------------------------ ---------------------------- void specialKeys (int key, int x, int y) {// Стрелка надясно-увеличаване на въртенето с 5 степен, ако (ключ == GLUT_KEY_RIGHT) завъртане_y += 5; // Стрелка наляво - намалете завъртането с 5 градуса иначе if (key == GLUT_KEY_LEFT) rotate_y - = 5; иначе ако (ключ == GLUT_KEY_UP) завъртане_x += 5; иначе ако (ключ == GLUT_KEY_DOWN) завъртане_x -= 5; // Искане на актуализация на дисплея glutPostRedisplay (); } // ----------------------------------------------- ----------- // Главна функция // ------------------------------- --------------------------- int main (int argc, char* argv ) {// Инициализира GLUT и обработва потребителските параметри glutInit (& argc, argv); // Искане на двоен буфериран прозорец с истински цвят със Z-буфер glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); // Създаване на прозорец glutCreateWindow ("Awesome Cube"); // Активиране на теста за дълбочина на Z-буфера glEnable (GL_DEPTH_TEST); // Функции за обратно повикване glutDisplayFunc (дисплей); glutSpecialFunc (specialKeys); // Предава контрол на GLUT за събития glutMainLoop (); // връщане към OS връщане 0; }

Препоръчано: