• Компютри и Електроника
  • Програмиране

Как да си направим един куб в OpenGL

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



За този проект, трябва знания и C среда за разработка.

Стъпки

Част 1 от 4: Първоначална настройка и главната ()

1) Инсталирайте OpenGL

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

2) Създаване на нов файл

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

3) #includes

  • Всъщност, това са #include директиви, които имаме нужда. Важно е да се помни, че насоките за различните операционни системи - различни и затова всички ние трябва да изберем да програма може да се управлява на всяка система.

    // Включва #include LT; stdio.hgt; #include LT; stdarg.hgt; #include LT; math.hgt; #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include LT; GLUT / glut.hgt; #else #include LT; GL / glut.hgt; # endif

4) Функционални прототипи и променлива hlobalyne

  • Това е време да се декларира и функционални прототипи.

    // Функция дисплей прототип невалидни (); невалидни specialKeys (); // Глобални променливи двойно rotate_y = 0; двойно rotate_x = 0;

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

5) да работи с основната) функция (

  • INT главната (INT argc, Чар * argv [) {// Initsializuvavshy GLUT и да се справят по поръчка параметри glutInit (argc, argv); // Запитана кутия с поддръжка на двойно буфериране, Z-буфер и цветова схема True Color glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

  • Това - тунинг нашата среда за разработка. Важно е да се помни, че работи за създаване на програми за OpenGL, вие имате всичко. Нужен ви е добро разбиране на това как да стартирате програмата, трябва да има ясно разбиране, че е необходимо тази функционалност. В този ред ние се създаде дисплей с двойно буфериране, подкрепа за RGB цветове и Z-буфериране.


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

    Решението е просто, добави втори буфер за рендиране. Изображение съответно otrisovyvaetsya в първия буфер, който се показва на екрана. Следващият кадър е изготвен на платното във втория буфер, а след изстрела обменят. Ние веднага да видите съдържанието на втория буфер, и първия буфер скрито от нас вторият ще бъде в същото време обяви и приключи третия кадър. И така нататък ...


  • В допълнение, ние трябва схемата за подпомагане на цветя RGB. Повече за използване на цветове в OpenGL - късно.


  • Z-буферен - Това е, в действителност, че създава триизмерен ефект. OpenGL използва триизмерна пространствена координатна система с оси X, Y и Z. Намаляване на зрителя, да го отстрани от публиката - за промяна на разстоянието по ос Z. Прочетете повече за това - твърде късно.


6) Създаване на прозорец

  • Сега се нуждаем създадете прозорец, която ще бъде съставена на платното куба. Наречете го прости и без излишни украшения - Awesome Cube, That "Cube Chic".

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

7) Активиране дълбочината на изпитване

  • OpenGL - тя е доста строга, което означава, че нищо не се активира. Ние сме също така да показва правилно триизмерен обект с помощта на Z-буфера изисква задълбочен тест. Изучаването на OpenGL за, вие ще откриете много повече от това, което трябва, за да активирате (осветление, текстура и т.н.).

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

8) функция за обратно извикване

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

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

9) функция за обратно извикване

  • Последната стъпка за настройка - Стартиране MainLoop, Основната линия, чрез която ние наричаме основна функция, докато програмата не е затворена.

    // Изпраща контрол върху събитията в GLUT glutMainLoop (); // Ние се върне в OS връщане 0;}

Част 2 на 4: Дисплеят на функцията ()

  • Цялата работа с otrysovkoy куб падане върху меки линии на fukntsyy. Като цяло, куба ще бъдат представени като отделни аспекти 6 поставят в подходящи координати.


  • Съответно, всяко лице ще има 4-те страни и 4 ъгъл, която ще свързва OpenGL линии и запълване на зоната между двата цвята. Това е, което ние твърде кажа.

1) glClear ()

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

    нищожен дисплей () {// Clear екрана и Z-буфериране glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

2) glBegin () и glEnd ()

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


  • Като се започне от предната част на куба. По-късно ние ще добавите цвят към всяко от лицата 6.

    // Multi Party - PEREDNYAYA glBegin (GL_POLYGON); // Vertex добавете следния krotsiglEnd ();

3) glVertex3f ()

  • Сега, когато имаме обясни програмата, която искаме да започнем полигона, имаме Vertex набор обект. Функциите glVertex са няколко форми на ползване се определят от намерението програмист.


  • Първо - колко измерения работите? Фигура 3 показва в glVertex3f в три измерения. Въпреки това, можете да работите в 2 и 4 измерения. Буквата F, от своя страна, показва, че ние работим с числа с плаваща запетая. Но тук можете да използвате и типове данни число, двойни и кратко.


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


  • Добави върха линии между glBegin () и glEnd () линии.

    // Multi Party - PEREDNYAYA glBegin (GL_POLYGON); glVertex3f (-0.5, -0.5, -0.5); // Р1 glVertex3f (-0.5, 0.5, -0.5); // Р2 glVertex3f (0.5, 0.5, -0.5); // P3 glVertex3f (0.5, -0.5, -0.5); // P4glEnd ();

4) glColor3f ()

  • glColor работи много подобен glVertex. Тип точки показват типове данни могат да бъдат кратки, целочислени, двойни или плуват. Всеки цвят е на стойност от 0 до 1. Всички нули - черен, всички единици, съответно, бяло. Фигура 3 в glColor3f () показва, цветовата схема на RGB без алфа канал. Не забравяйте, че Alpha е отговорен за прозрачност цвят. За смяна на алфа канал, използвайте glColor4f () с последния параметър 0-1, тоест от непрозрачността на прозрачност.


  • Обаждане glColor3f (), ние otrisovyvayemyh всеки връх от тази точка в тази tsvete.Inymi думи, ако и четирите Vertex трябва да е червено, просто само един, определен стойности за цвят командния glVertex3f (), и всички Vertex бъде червено


  • В примера по-долу на предната страна можем да видим как всеки се дава нов цвят Vertex. Когато правим това, ние можем да се опознаем интересна особеност цветя OpenGL. Както всеки полигон Vertex е с различен цвят, за OpenGL автоматично смесва цветовете! Кодът е долу, показва как да създадете Vertex 4 от същия цвят.

    // Multi Party - PEREDNYAYA 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 е purpleglEnd ();

5) Други лицето на куба

  • По-добре, разбира се, ако го направите откриете местоположението на останалата част от лицата на куб и всяка от тях verteksov. Въпреки това, за по-голяма простота, всичко се прави за вас. Кодът посочен в крайния дисплей функция (), публикуван по-долу.

    // White Party - ZADNYAYA 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 (); // Purple Party - компилациите 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 (); // Зелена партия - Lion 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 (); // Blue Side - Горна 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 (); // Red Party - Долна 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 от 4: Интерактивност Program

1) specialKeys ()

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


  • Именно поради тази функция ние декларирахме глобални променливи и rotate_x rotate_y. Когато натиснете левия и десния клавишите със стрелки, rotate_y стойност ще се увеличи или намали с 5 градуса. По същия начин, стойността ще варира и rotate_x, но при натискане на клавишите със стрелки "нагоре" и "надолу".

    невалидни specialKeys (ключова INT, INT X, Y INT) {// Дясна стрелка - увеличение на въртене 5 градуса ако (ключова == GLUT_KEY_RIGHT) rotate_y + = 5; // Лява стрелка - намаление от 5 градуса въртене иначе ако (бутон = = GLUT_KEY_LEFT) rotate_y - = 5; иначе, ако (ключова == GLUT_KEY_UP) rotate_x + = 5; иначе, ако (ключова == GLUT_KEY_DOWN) rotate_x - = 5; // опресняване искане glutPostRedisplay ();}

2) glRotate ()

  • Последното нещо, което правим, така че ще добавите линия, която ще ни позволи да се върти на обекта. Назад към функцията дисплей () и описанието на предната част на добавката:

    // Reset трансформации glLoadIdentity (); // въртене при смяна на потребителски rotate_x ценности и rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0.0, 1.0, 0.0); // многопартийна - PEREDNYAYA ....

  • Забележка синтаксиса glRotatef (), който е подобен на синтаксиса glColor3f () и glVertex3f (), но винаги изисква 4 параметрите, определени. Първо - ъгъл на завъртане в градуси. Следващите три - оста на която въртенето е за х GT на; Y GT; Z. Досега, ние трябва да завъртите куб върху две оси, х и у.


  • За всички трансформации, които задаваме в програмата се наложи подобни линии. В действителност, ние представляваме въртенето на обекта върху оста х като промяна в стойността rotate_x, и оста на въртене в - промяна в rotate_y на стойност. Въпреки това, OpenGL обедини всички в една матрица трансформация. Всеки път, когато се обадите дисплей функция, ние ще създадем трансформация матрица, и glLoadIdentity () ще ни позволи да започне всеки път с новата матрица.


  • Други характеристики на трансформация, които можем да използваме, тя glTranslatef () и glScalef (). Те са подобни glRotatef (), но само с тази разлика, че само изисква 3 параметри: стойността на X, Y и Z, за да промените или мащабите на обекта.


  • Към всичко показва правилно, когато всички три трансформации приложени към един обект, трябва да ги посочите в правилния ред, а именно glTranslate, glRotate, glScale - и никога не друго. OpenGL трансформира програмата на обект четене "отдолу-нагоре". За да разберем това по-добре, да си представя как ще изглежда 1x1x1 куб след всички трансформации, ако OpenGL ги прилага в същия ред, като изброените (отгоре-надолу), и след това да се мисли за това как OpenGL процес на куба, четете инструкциите от дъното нагоре.


  • Добави следната команда за двоен куб мащабиране на осите х и у, куба да се върти на 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);

Компилация

  • Какво завършва всеки проект, в OpenGL? Как ще първия си проект в OpenGL? Точно така, бутон компилирате и стартирате свой код (Събиране и тичам). Например, като ви компилатор GCC, толкова вида в терминала следните команди:

    На Linux: GCC cube.c -o куб -lglut -lGL / MycubeNa Mac: GCC -o Foo foo.c -framework GLUT -framework OpenGL ./ mycubeNa Windows:. GCC -Wall -ofoo foo.c -lglut32cu -lglu32 - lopengl32 ./ mycube

Част 4 от 4: Final код

  • Така че стана така! Готов първата си програма в OpenGL! Ето изходния код от автора на статията, която не е прехвърлена коментари и всичко останало.

    // // File: mycube.c // Автор: Matt Daisley // Създаден: 04/25/2012 // Проект: Сорс кодът Направи Cube в OpenGL // Описание: Създава прозорец OpenGL и чертае 3D куб / /, че потребителят може да се върти с помощта на клавишите със стрелки // // Контроли: Лява стрелка - Rotate Left // дясна стрелка - Rotate Right // Up Arrow - Завъртете Up // стрелка надолу - Завъртете надолу // ------ ------------------------------------------ -------- - // Включва // ----------------------------------- -------- --------------- #include LT; stdio.hgt; #include LT; stdarg.hgt; #include LT; math.hgt; #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include LT; GLUT / glut.hgt; #else #include LT; GL / glut.hgt; # Endif // ---------------------------------------------- - ---------- // Функция Прототипи // -------------------------------- - ------------------------ дисплей невалидни (); невалидни specialKeys (); // ------------------------------------------- ----- ---------- // Глобални променливи // ----------------------------- ----- ------------------------ двойно rotate_y = 0; двойни rotate_x = 0; // ------------------------------------------- ----- ---------- // дисплей () функция за обратно извикване // -------------------------- ----- --------------------------- невалидни дисплей () {// Clear екран и Z-буфер glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); // Reset трансформации glLoadIdentity (); // Други Трансформации // glTranslatef (0.1, 0.0, 0.0); // Не се включват // glRotatef (180, 0.0, 1.0, 0.0); // Не се включват // Rotate когато промените потребителски rotate_x и rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (rotate_y, 0.0, 1.0, 0.0); // Други Transformations // 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 е purpleglEnd (); // Бяла страна - BACK 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 (); // Purple страна - Право 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 (); // Green страна - НАЛЯВО 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 (); // Blue страна - 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 (); // Red страна - ДОЛУ 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 () функция за обратно извикване // -------------------------- ----- --------------------------- невалидни specialKeys (INT ключови, INT X, Y INT) {// Дясна стрелка - увеличаване на въртене от 5 градуса, ако (ключова == GLUT_KEY_RIGHT) rotate_y + = 5; // Лява стрелка - въртене намаление с 5 градуса иначе ако (ключова == GLUT_KEY_LEFT) rotate_y - = 5; иначе, ако (ключова == GLUT_KEY_UP) rotate_x + = 5; иначе, ако (ключова == GLUT_KEY_DOWN) rotate_x - = 5; // актуализация Заявка дисплей glutPostRedisplay ();} // ---------------------- -------------------------- ---------- // основната) функция (// ------ -------------------------- ------------------------ - INT главната (INT argc, Чар * argv [) {// Инициализиране GLUT и параметри на процеса, потребителски glutInit (argc, argv); // запитване двойно буфериран True Color прозорец със Z-буфер glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); // Създаване на прозорец glutCreateWindow (Awesome Cube); // Enable дълбочина Z-буфер тест glEnable (GL_DEPTH_TEST); // обратно извикване glutDisplayFunc (дисплей); glutSpecialFunc (specialKeys); // Pass контрол на GLUT за събития glutMainLoop (); // Върни към OS връщане 0;}