OpenGL-жөнөкөй примитивдерден үч өлчөмдүү татаал көрүнүштөрдү тартуу үчүн колдонулган күчтүү 3D программалоо куралы. Бул макала сизге үч өлчөмдө көрүү үчүн айлана турган жөнөкөй кубду тартууну үйрөтөт!
Бул долбоор үчүн сизге код редактору жана С программалоо боюнча бир аз билим керек болот.
Кадамдар
3төн 1 бөлүк: Баштапкы орнотуу
Кадам 1. OpenGL орнотуу Баштоо үчүн OpenGLди системаңызга орнотуу үчүн бул кадамдарды аткарыңыз
Эгерде сизде OpenGL, ошондой эле шайкеш C компилятору орнотулган болсо, анда бул кадамды өткөрүп жиберип, кийинкисине өтүңүз.
Кадам 2. Документти түзүү
Сүйүктүү код редакторуңузда жаңы файл түзүңүз жана аны mycube.c катары сактаңыз
3 -кадам. #Камтыйт
Бул сиздин программаңызга керектүү болгон негизги нерселер. Иш жүзүндө ар кандай операциялык тутумдар үчүн керектүү болгон нерселер бар экенин түшүнүү маанилүү. Программаңыз ар тараптуу жана каалаган колдонуучу үчүн иштей алышы үчүн булардын баарын камтууну унутпаңыз.
// камтыйт #кошуу #кошуу #кошуу #аныктоо GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #кошуу #башка #кошуу #endif
Кадам 4. Функциянын прототиптерин жана глобалдык өзгөрмөлөрдү кошуңуз
Сиздин кийинки кадамыңыз - кээ бир функциянын прототиптерин жарыялоо.
// Function Prototypes void display (); Void specialKeys (); // Global Variables double rotate_y = 0; double rotate_x = 0;
Кадам 5. main () функциясын орнотуңуз
int main (int argc, char* argv ) {// GLUTты иштетүү жана glutInit колдонуучунун параметрлерин иштетүү (& argc, argv); // Z-buffer glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH) менен кош буферленген чыныгы түс терезесин сурануу;
Кадам 6. Терезени түзүү
Кийинки кадам - бул терезени түзүү анын ичинде сиз кубаны тартасыз. Бул окуу куралында терезе "Укмуш куб" деп аталат.
// Терезе glutCreateWindow түзүү ("Укмуш куб");
Кадам 7. Тереңдикти текшерүүнү иштетүү
OpenGL - бул катаал тил, анткени ал эч кандай атайын функция иштетилген деп ойлобойт. Программаңыз 3-өлчөмдө туура каралышы үчүн, сиз мурда караган Z-буферин колдонушуңуз керек тереңдикти текшерүүнү иштетүү. OpenGLди изилдөөнү улантып жатып, сиз жарык берүү, текстуралар, бырышуу жана башка көптөгөн нерселерди камтыган көптөгөн функцияларды ачасыз.
// Z-буфердик тереңдикти текшерүүнү иштетүү glEnable (GL_DEPTH_TEST);
Кадам 8. Кайра чалуу функцияларын кошуңуз
Бул жерде сиз мурунку прототиптериңизди кайра чалуу функциялары. Ар бир жолу негизги цикл аркылуу бул функциялар чакырылат. Дисплей функциясы мурунку чалуудан бери өзгөрмөлөрдүн өзгөрүшүнө негизделген көрүнүштү кайра тартат. SpecialKeys функциясы бизге программа менен иштешүүгө мүмкүнчүлүк берет.
// Callback функциялары glutDisplayFunc (дисплей); glutSpecialFunc (specialKeys);
Кадам 9. MainLoopту баштаңыз
Бул анимацияга жана колдонуучунун өз ара аракеттенүүсүнө уруксат берүү үчүн программаны жапмайынча, негизги функцияны эстейт.
// glutMainLoop () окуялары үчүн башкарууну GLUTка өткөрүңүз; // ОСко кайтуу 0; }
3төн 2 бөлүк: дисплей () Функциясы
Кадам 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); // Vertices кийинки кадамда кошулат glEnd ();
Кадам 4. glVertex3f () кошуу
Сиз полигонуңузду баштайм деп айткандан кийин, керек чокуларды аныктоо объектинин. glVertex сиздин объект менен эмне кылгыңыз келгенине жараша бир нече формаларга ээ.
- Биринчиси, сиз канча өлчөмдө иштеп жатканыңыз. GlVertex3fтеги 3 жогору сиз 3 өлчөмдө чийип жатканыңызды айтат. Ошондой эле 2 же 4 өлчөмдө иштөөгө болот. GlVertex3f ичиндеги f сиз өзгөрмөлүү чекит сандары менен иштеп жатканыңызды айтат. Сиз ошондой эле шорты, бүтүн сандарды же дублдерди колдоно аласыз.
- Бул пункттар а -да аныкталганын байкаңыз сааттын жебесине каршы манера. Бул азырынча анча маанилүү эмес, бирок сиз жарык, текстуралар жана бүктөлүп кароо менен иштей баштаганда, бул абдан маанилүү болуп калат, андыктан упайларыңызды азыр саат жебесине каршы аныктоону адатка айлантыңыз.
- 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лердин баары чекитти ак кылат. GlColor3f () ичиндеги 3 альфа каналы жок 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. Башка тараптарды иштетүү
Кубанын калган беш тарабы үчүн ар бир чокунун орду кандай болорун билип алыңыз, бирок жөнөкөйлүк үчүн булар сиз үчүн эсептелген жана акыркы дисплей () функциясы төмөндө.
// Ак жагы - 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 (); // Күлгүн тарабы - ОҢ 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 (); // Жашыл тарап - LEFT 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 () кошуу
Сиз дээрлик бүттүңүз, бирок учурда сиз кубду тарта аласыз, бирок аны айлантууга эч кандай мүмкүнчүлүгүңүз жок. Бул үчүн, сиз жасайсыз 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 градуска азайтыңыз, эгерде (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. 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ге, у огу боюнча 2ге, кубикти огу боюнча 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. Түзүү жана кодду иштетүү
Сиз gccти компилятор катары колдонуп жатасыз деп ойлосоңуз, программаңызды компиляциялоо жана сыноо үчүн бул буйруктарды терминалыңыздан иштетиңиз.
Linux боюнча: gcc cube.c -o cube -lglut -lGL./ mycube Macта: gcc -o foo foo.c -ramework GLUT -framework OpenGL./ mycube Windowsто: gcc -Wall -ofoo foo.c -lglut32cu - lglu32 -lopengl32./ mycube
Кадам 5. Толук кодуңузду текшериңиз
Ал мындай болушу керек:
// // Файл: mycube.c // Автор: Мэтт Дейсли // Түзүлгөн: 25.04.2012 // Долбоор: OpenGLде Куб жасоо үчүн баштапкы код // Сүрөттөмө: OpenGL терезесин түзүп, 3D кубун тартат/ / Колдонуучу жебе баскычтарын колдонуп айлана алат // // Башкаруулар: Сол жебе -Солго буруу // Оңго жебе -Оңго буруу // Өйдөгө өйдө кароо -------------------------------------------------- -// камтыйт // ------------------------------------------- --------------- #кошуу #кошуу #кошуу #аныктоо GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #кошуу #дагы #кошуу #endif // ------------- --------------------------------------------- // Функциянын прототиптери / / ------------------------------------------------- --------- void display (); Void specialKeys (); // ------------------------------------------------ ---------- // Глобалдык өзгөрмөлөр // ---------------------------------- ------------------------ double rotate_y = 0; double rotate_x = 0; // ------------------------------------------------ ---------- // display () Callback функциясы // ------------------------------- --------------------------- 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 (); // Ак жагы - 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 (); // Күлгүн тарабы - ОҢ 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 (); // Жашыл тарап - LEFT 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ке көбөйтүү даража эгерде (key == GLUT_KEY_RIGHT) rotate_y += 5; // Сол жебе - айланууну 5 градуска азайтыңыз, эгерде (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 (); } // ----------------------------------------------- ----------- // main () функциясы // ------------------------------- --------------------------- int main (int argc, char* argv ) {// GLUTты инициализациялоо жана glutInit колдонуучу параметрлерин иштетүү (& argc, argv); // Z-buffer glutInitDisplayMode менен кош буферленген чыныгы түстүү терезени сурануу (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); // Терезе glutCreateWindow түзүү ("Укмуш куб"); // Z-буфердик тереңдикти текшерүүнү иштетүү glEnable (GL_DEPTH_TEST); // Callback функциялары glutDisplayFunc (дисплей); glutSpecialFunc (specialKeys); // glutMainLoop () окуялары үчүн көзөмөлдү GLUTка өткөрүңүз; // ОСко кайтуу 0; }