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

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

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

Стъпка 3. Добавете #includes
Това са основните включвания, които ще ви трябват за вашата програма. Важно е да се разбере, че всъщност има различни включвания, необходими за различните операционни системи. Не забравяйте да включите всичко това, за да сте сигурни, че вашата програма е универсална и може да работи за всеки потребител.
// Включва #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include #else #include #endif

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

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

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

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

Стъпка 8. Добавете функции за обратно повикване
Ето функциите за обратно повикване, за които сте писали прототипите по -рано. Всеки път през главния цикъл тези функции ще се извикват. Функцията за показване прекроява сцената въз основа на всички промени в променливите, направени от предишното повикване. Функцията specialKeys ни позволява да взаимодействаме с програмата.
// Функции за обратно повикване glutDisplayFunc (дисплей); glutSpecialFunc (specialKeys);

Стъпка 9. Стартирайте MainLoop
Това ще извика основната функция, докато не затворите програмата, за да позволите анимации и взаимодействие с потребителя.
// Предава контрол на GLUT за събития glutMainLoop (); // връщане към OS връщане 0; }
Част 2 от 3: Функцията на дисплея ()

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

Стъпка 2. Добавете glClear ()
Първата стъпка, която трябва да направите в тази функция, е да изчистете цвета и Z буфера. Без тези стъпки старите чертежи все още могат да се виждат под новите чертежи и начертаните обекти няма да са на правилното място на екрана.
void display () {// Изчистване на екрана и Z-буфер glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Стъпка 3. Добавете glBegin () и glEnd ()
OpenGL определя обектите като комбинации от различни многоъгълници. Използвайки glBegin () команда, ефективно поставяте молив, който ще нарисува форма. За да повдигнете молива и да започнете нова форма, трябва да използвате glEnd () команда. В този урок ще използвате GL_POLYGON, за да нарисувате всяка страна на куба, но е възможно да използвате други опции за параметри, като GL_LINE, GL_QUAD или GL_TRIANGLE, за да създадете други форми.
- Тук ще започнете с предната част на вашия куб. По -късно ще добавите цвят към всички 6 страни.
// Многоцветна страна - FRONT glBegin (GL_POLYGON); // Върховете ще бъдат добавени в следващата стъпка glEnd ();

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

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

Стъпка 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: Интерактивност на потребителя

Стъпка 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 (); }

Стъпка 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); // Многоцветна страна - ПЕРЕД….

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

Стъпка 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. Проверете пълния си код
Трябва да е така:
// // Файл: 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; }