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

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

Стъпка

Част 1 от 3:
Първоначална инсталация
един. Инсталирайте OpenGL. Старт S OpenGL монтажни ръководства на вашия компютър. Ако OpenGL и компилаторът с вас вече имате, можете да пропуснете тази стъпка и да преминете към следващата.
  • 2. Създайте документ. Създайте нов файл в любимия си код за код и го запазете като mycube.° С
  • 3. Добавете # uncludes. Ето основните директиви #include, които ви трябва. Важно е да се помни, че директивите за различни операционни системи са различни и затова е необходимо да се избере всичко, така че програмата да е универсална и може да бъде пусната в която и да е система.
    // включва # включва #Include #Include #Define gl_gelxt_prototypes # ifdef __apple __ # включва # друго # включва #endif
  • 4. Добавете функционални прототипи и глобални променливи. Следващата стъпка ще декларира функционалните прототипи.
    // Функционален прототипизоиден дисплей () - Void Specialkeys () - // Global VariablesDeble Rotate_y = 0-Double Rotate_X = 0-
  • пет. Задайте основната () функция.
    Int main (int argc, char * argv []) // инициализиране на минута и процеси на потребителски параметриЛутинит (и argc, argv) - // заявете двоен буферен прозорец, z-буферизация и цветова схема истински colorglutinitdisplaymode (Glut_Double 
  • Част 2 от 3:
    Функция на дисплея ()
    един. Разберете заданието на функцията на дисплея (). Цялата работа по рисуване на Куба ще падне върху нестабилните линии на тази функция. Идеята като цяло е следната: нарисувате шест отделни лица на куба и ги поставете в подходящите позиции.
    • За всяко лице ще дефинирате четири ъгъл и отворете ги с линии и попълнете цвета, който сте избрали. По-долу ще кажа как да го направя.
  • 2. Добавете функцията Glclear (). На първо място, работещи с тази функция, ние се нуждаем Ясен цвят и z буфер. Без това под новия модел ще се видят стари и обектите, изтеглени от програмата, ще бъдат подредени неправилно.
    Void дисплей () gl_depth_buffer_bit)-
  • 3. Добавете Glbegin () и Glend (). Обектите OpenGL са комбинации от различни полигони. Екип Glbegin () Позволете ни да нарисуваме обект с вас - това е като молив, който рисувате фигура, без да я разкъсвате от хартия. Да разкъсате молива от листа и да започнете да рисувате нещо ново, имате нужда от екип Гледай (). В тази статия ще използваме GL_Polygon за изтегляне на всеки ръб на куба, въпреки че е възможно да използвате други параметри като GL_Line, GL_QUAD или GL_TRIANGLE за създаване на други форми.
  • Започнете с предната част на куба. По-късно ще добавим цвета на всеки от шестте лица.
  • // Multicolor Side - фронтглбектин (gl_polygon) - // стихове Добавяне в следващата петна ()-
  • 4. Добавете функцията GLVERTEX3F (). Сега, когато сте обяснили програмата, която искате да започнете да рисувате многоъгълник, имате нужда Задайте върхове Обект. Функцията GLVERTEX има няколко форми, чието използване зависи от това, което възнамерявате да направите с вашия обект.
  • Първо - колко измервания ще работите? Фигура 3 в Glvertex3F показва три измерения. Можете обаче да работите в 2 и в 4 измервания. Буквата F, от своя страна, показва, че работим с плаващи точка и запетая. Въпреки това, можете да използвате цели числа, двойни или къси типове.
  • Имайте предвид, че всички точки са зададени обратно на часовниковата стрелка стрелки. Въпреки че не е много важно, но когато започнете да работите по осветление, текстуриране, лечение на не-тарифни лица, навикът да се предписват всичко обратно на часовниковата стрелка, ще бъде много полезно за вас.
  • Добавете върховете между Glbegin () и Glend () линии.


  • // Multicolor Side - фронтглбектин (gl_polygon) -glvertex3f (-0.петдесет души.петдесет души.5) - // p1glvertex3f (-0.5.0.петдесет души.5) - // p2glvertex3f (0.5.0.петдесет души.5) - // p3glvertex3f (0.петдесет души.петдесет души.5) - // p4glend ()-
  • пет. Добавете функцията GLColor3F (). Glcolor действа по много начини, подобно на Glvertex. Точки, които можете да зададете типове данни кратко, цяло число, двойно или поплавък. Всеки цвят има стойност от 0 до 1. Всички нули са черни, всички единици - съответно, бели. Фигура 3 в glcolor3f () показва RGB цветова схема без алфа канал. Цветовете на алфа канал са отговорни за прозрачността му. За да промените стойността на алфа канал, използвайте glcolor4f () с последния параметър от 0 до 1, т.е. от непрозрачна до прозрачност.
  • Обаждане на glcolor3f (), ние правим всеки връх от посочената точка в посочения цвят. С други думи, ако всичките четири върхове трябва да бъдат червени, след това само един само време зададе цветовата стойност, преди да се обадите на команди GLVERTEX3F (), и те ще бъдат червени.
  • При примера на предната част по-долу можете да видите как е зададен новия цвят на всеки връх. Когато го направите, можете да се запознаете с интересна характеристика на цветята OpenGL. Тъй като всяка щипка от полигона има свой собствен цвят, OpenGL автоматично смесва цветове! Кодът, поставен върху показва как да се създадат четири върха със същия цвят.
  • // Multicolor Side - фронтглбектин (gl_polygon) -glcolor3f (1.0, 0.0, 0.0) -glvertex3F (0.петдесет души.петдесет души.5) - // P1 Redglcolor3F (0.0, 1.0, 0.0) -glvertex3F (0.5.0.петдесет души.5) - // p2 greenglcolor3f (0.0, 0.0, 1.0) -glvertex3F (-0.5.0.петдесет души.5) - // p3 blueglcolor3f (1.0, 0.0, 1.0) -glvertex3F (-0.петдесет души.петдесет души.5) - // p4 purpleglend ()-
  • 6. Нарисувайте други лица Куба. По-добре, разбира се, ако сами намират местоположението на останалата част от куба и всеки от върховете, но в името на простотата, която ги изчислихме за вас. Кодът е даден Б Последният функционален дисплей () По-долу.
    // бяла страна - outglbegin (gl_polygon) -glcolor3f (1.0.1.0, 1.0) -glvertex3F (0.петдесет души.петдесет души.5) -glvertex3F (0.5.0.петдесет души.5) -glvertex3F (-0.5.0.петдесет души.5) -glvertex3F (-0.петдесет души.петдесет души.5) -glend () - // Violet Side - Rursglbegin (gl_polygon) -glcolor3f (1.0,0.0.1.0) -glvertex3F (0.петдесет души.петдесет души.5) -glvertex3F (0.5.0.петдесет души.5) -glvertex3F (0.5.0.5.0.5) -glvertex3F (0.петдесет души.5.0.5) -люд () - // зелена страна - leapglbegin (gl_polygon) -glcolor3f (0.0.1.0,0.0) -glvertex3F (-0.петдесет души.5.0.5) -glvertex3F (-0.5.0.5.0.5) -glvertex3F (-0.5.0.петдесет души.5) -glvertex3F (-0.петдесет души.петдесет души.5) -glend () - // синя страна - гласGlbegin (gl_polygon) -glcolor3f (0.0,0.0.1.0) -glvertex3F (0.5.0.5.0.5) -glvertex3F (0.5.0.петдесет души.5) -glvertex3F (-0.5.0.петдесет души.5) -glvertex3F (-0.5.0.5.0.5) -glend () - // червена страна - nizhnyglbegin (gl_polygon) -glcolor3f (1.0,0.0,0.0) -glvertex3F (0.петдесет души.петдесет души.5) -glvertex3F (0.петдесет души.5.0.5) -glvertex3F (-0.петдесет души.5.0.5) -glvertex3F (-0.петдесет души.петдесет души.5) -glend () - Glllush () - Glutswapbuffers ()-
  • Обърнете внимание на последните две линии. Това са функции glflush ()- и glutswapbuffers ()-, Даване на ефекта на двойното буфериране, което беше казано по-горе.
  • Част 3 от 3:
    Интерактивна програма
    един. Добавете функцията Specialkeys (). По принцип всичко е почти готово, но кубчето е изтеглено само и не се върти. За да направите това, създайте Функция Специалност (), което ще завърти куба, като натиснете клавишите със стрелки!
    • Беше за тази функция, че глобалните променливи се съобщават и Rotate_y са обявени. Когато натиснете "ляво" и "Right" клавишите със стрелки, rotate_y стойността ще се увеличи или ще намалее с пет градуса. По същия начин ще променим стойността на Rotate_X, но вече натискане на стрелките "Up" и надолу.
    Void Specialkeys (int Key, int x, int y) {// стрелка надясно - увеличаване на въртенето на 5 градуса (клавиш == glut_key_right) Rotate_y + = 5 - // arel arrow - намаляване на въртенето на 5 градуса, ако (ключ == glut_key_left) Rotate_y - = 5-иначе, ако (клавиш == glut_key_up) Rotate_X + = 5-иначе, ако (клавиш == glut_key_down) Rotate_X - = 5 - // Заявка за актуализиране на screenglutpostredisplay () -} t
  • 2. Добавете glrotate (). Последното нещо, което ще направим, е да добавим низ, който ще ни позволи да завъртим обекта. Връщане към функцията Дисплей () И преди да опишете предната част, добавете:
    // Reset TransformationsgloadIdity () - // завъртане при промяна на потребителя Rotate_x и Rotate_yglrotatef стойности (Rotate_x, 1.0, 0.0, 0.0) -glrotatef (RotaTe_y, 0.0, 1.0, 0.0) - // Многоцветна страна - отпред....
  • Обърнете внимание на този синтаксис glrotatef (), което е подобно на синтаксиса на glcolor3f () и glvertex3f (), но винаги изисква индикация за четири параметъра. Първо - ъгълът на въртене в градуси. Следните три - оси, за които въртенето отива, в реда x, y, z. Досега трябва да завъртим куба на две оси, x и y.
  • За всички трансформации, които определяме програмата, са необходими подобни линии. Всъщност, ние представяме въртенето на обекта по оста х като промяна в стойността на ротацията и въртенето на оста на оста - като промяна в стойността на Rotate_y. Въпреки това, OpenGL ще обедини всичко в една матрица за трансформация. Независимо дали да се обадите на функцията на дисплея, ще създадете матрица за трансформация и GloadIentity () ще ви позволи да започнете всеки път с нова матрица.
  • Други функции за трансформация, които можете да използвате, е Gltranslatef () и Glcalef (). Те са подобни на glrotatef (), с изключение на това, че само три параметъра изискват: стойностите x, y и z за промяна и мащабиране на обекта.
  • Така че всичко се показва правилно, когато всичките три трансформации се приложат към един обект, трябва да зададете трансформации в съответния ред, а именно Gltranslate, Glrotate, Glscale - и никога повече. OpenGL преобразува обект, който чете програмата отдолу нагоре. За да разберете по-добре това, представете си как 1x1x1 куб ще се грижи за всички трансформации, ако OpenGL ги нанесе в ред като посочените (отгоре надолу), и след това помислете как OpenGL третира куба, като чете инструкциите от дъното.
  • 3. Добавете следните команди за двукратно скачане на куба по осите X и Y, за да завъртите куб 180 градуса по оста на оста, както и да преместите куба с 0.1 по оста х. Уверете се, че всички съответни команди, включително по-рано зададените Glrotate () команди, са посочени в правилния ред. Ако се страхувате да грешите, вижте окончателната версия на програмата в края на статията.
    // Други трансформацииГлонгранслат (0.10.0, 0.0) -glrotatef (180, 0.0, 1.0, 0.0) -glscalef (2.0, 2.0, 0.0)-
  • 4. Компилирайте и стартирайте кода. Да предположим, че използвате GCC като компилатор, затова въведете следните команди на терминала:
    На Linux: GCC куб.c -o cube -lglut -lgl./ Mycuben mac: gcc -o foo foo foo.C -FRAMEWERN GLUT-Framework OpenGL./ Mycube прозорци: gcc -wall -fooo foo.C -LGLUT32CU -LGLU32 -LOPENGL32./ Mycube
  • пет. Проверете окончателния код. Ето окончателния код, създаден от автора на статията, в която коментарите не са преведени.
    //// файл: mycube.C // Author: Мат Дайсли // Създаден: 4/25 / 2012 // Проект: Изходен код за създаване на куб в OpenGL // Описание: Създава отворен прозорец и изтегля 3D куб //, че потребителят може да се върти с помощта на Клавиши със стрелки // // Контроли: Остава стрелка- Завъртане ляво // Стрелка надясно - Завъртане надясно // Поддръжка нагоре // Стрелка надолу // Завъртане надолу // -------------- -------------------------------------------- // включва // - -------------------------------------------------- - ------- # включва #Include #Include #Define gl_gelxt_prototypes # ifdef __apple __ # включва # else # включва # endif // --------------------------------- - ------------------------ // функционални прототипи //------------------ --- -------------------------------------- Void Дисплей () - Void Specialkeys () - // ----------------------------------------------- ----- -------- // Глобални променливи // ------------------------------- ------- ---------------------- двойно Rotate_y = 0-Double Rotate_X = 0 - // --------- ------- ------------------------------------------ / / дисплей () функция за обратно извикване / / ------------------------------------------ ------- --------- void дисплей () // чист екран и z-buchergllear (gl_color_buffer_bit //----------------- ------- --------------------------------- // Функция за обаждания // ------- ------------------------------------------- --------- Void Specialkeys (int ключ, int x, int y) {// стрелка надясно - увеличаване на въртенето с 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 - // Искане на дисплея АктуализацияGlutrodisplay () -} // ------ -------------------------------------------------- - - // основна () функция // --------------------------------------- --- ------------------ int main (int argc, char * argv []) glut_depth) - // Създаване на прозорецGlutcreateWindow ("Страхотен куб") - // Разрешаване на дълбочина Z-буфер терен (gl_depth_test) - // Функции за обратно извикванеДъщерятаглавина (дисплей) -GLUTSPECIALFUNC (специални) - // Pass Control до Glut за eventsglutmainloop () - // Връщане в Osreturn 0-
  • Подобни публикации