OpenGLде кубду кантип жасоо керек

Автор: Gregory Harris
Жаратылган Күнү: 12 Апрель 2021
Жаңыртуу Күнү: 1 Июль 2024
Anonim
Кубик Рубик  Кыргызча
Видео: Кубик Рубик Кыргызча

Мазмун

OpenGL - бул жөнөкөй фигуралардан татаал 3D сүрөттөрдү түзүүгө мүмкүндүк берүүчү 3D программалоо куралы. Бул макалада сиз анын жардамы менен үч өлчөмдө айландырыла турган кубикти кантип тартууну үйрөнөсүз!

Кадамдар

3 ичинен 1 -бөлүк: Алгачкы орнотуу

  1. 1 OpenGL орнотуу. OpenGLди компьютериңизге кантип орнотууну үйрөткүчтөн баштаңыз. Эгерде сизде OpenGL жана C компилятору болсо, анда бул кадамды өткөрүп жиберип, кийинки кадамга өтсөңүз болот.
  2. 2 Документ түзүү. Сүйүктүү код редакторуңузда жаңы файл түзүңүз жана аны mycube.c катары сактаңыз
  3. 3 #Камтыйт. Бул жерде сизге керектүү негизги #include директивалары. Ар кандай операциялык тутумдар үчүн директивалар ар башка экенин эстен чыгарбоо керек, ошондуктан программа универсалдуу жана каалаган системада иштей тургандай кылып баарын тандоо керек.

      // камтыйт #include stdio.h> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #калган #кошуу GL / glut.h> #endif

  4. 4 Функционалдык прототиптерди жана глобалдарды кошуңуз. Кийинки кадам - ​​функционалдык прототиптерди жарыялоо.

      // Функционалдык прототиптер void display (); Void specialKeys (); // Глобалдык өзгөрмөлөр double rotate_y = 0; double rotate_x = 0;

  5. 5 Main () функциясын аныктаңыз.

      int main (int argc, char * argv []) // GLUTты инициализациялоо жана glutInit ыңгайлаштырылган параметрлерин иштетүү (& argc, argv); // Кош Буферлөө, Z-Буферлөө жана Чыныгы Түс glutInitDisplayMode (GLUT_DOUBLE) үчүн колдоосу бар терезени сураңыз

3төн 2 бөлүк: дисплей () Функциясы

  1. 1 Display () функциясынын максатын түшүнүңүз. Кубду көрсөтүү боюнча бардык иштер бул иштин назик линияларына түшөт. Жалпы идея мындай: сиз кубдун алты өзүнчө жүзүн тартып, аларды тиешелүү позициясына жайгаштырасыз.
    • Ар бир жүз үчүн сиз төрт бурчту аныктайсыз жана OpenGL аларды сызыктар менен туташтырып, тандаган түсүңүзгө толтурат. Муну кантип кылуу керектиги төмөндө түшүндүрүлөт.
  2. 2 GlClear () функциясын кошуу. Биринчиден, бул функция менен иштөөдө бизге керек ачык түс жана z-буфер... Бул болбосо, эски сүрөт жаңы сүрөттүн астында көрүнөт жана программа тарткан объекттер туура эмес жайгаштырылат.

      void display () // Экранды тазалоо жана Z буферин glClear (GL_COLOR_BUFFER_BIT

    • Акыркы эки сапка көңүл буруңуз. Бул функциялар glFlush (); жана glutSwapBuffers ();, жогоруда сүрөттөлгөн кош буферлөө эффектин берүү.

3төн 3 бөлүк: Программалык интерактивдүүлүк

  1. 1 SpecialKeys () функциясын кошуңуз. Негизи, бардыгы дээрлик даяр, бирок куб тек гана тартылган жана бурулган эмес. Бул үчүн, түзүү керек specialKeys () функциясы, бул жебенин баскычтарын басуу менен кубду айлантууга мүмкүндүк берет!
    • Бул глобалдык rotate_x жана rotate_y өзгөрмөлөрү жарыяланган. Сиз сол жана оң жебе баскычтарын басканда, rotate_y мааниси беш градуска жогорулайт же төмөндөйт. 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. 2 GlRotate () кошуу. Биз жасай турган акыркы нерсе - объектти айлантууга мүмкүндүк бере турган сапты кошуу. Функцияга кайтуу дисплей () жана ФРОНТ тарабынын сүрөттөмөсүнөн мурун:

      // Reset Transforms 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 () синтаксисине окшош, бирок дайыма төрт параметрди талап кылат. Биринчиси - градус менен айлануу бурчу. Кийинки үчөө айлануу ишке ашкан октор, x, y, z тартибинде. Азырынча кубду x жана y эки огунун айланасында айлантуубуз керек.
    • Биз программада аныктаган бардык өзгөртүүлөр окшош саптарды талап кылат. Негизинен, биз бир нерсенин х огу боюнча айлануусун rotate_x маанисинин өзгөрүшү жана y огунун айлануусун rotate_y маанисинин өзгөрүшү катары көрсөтөбүз. Бирок, OpenGL баарын бир трансформация матрицасына бириктирет. Дисплейге чалган сайын, сиз трансформация матрицасын түзөсүз, жана glLoadIdentity () ар бир жолу жаңы матрицадан баштоого мүмкүндүк берет.
    • Сиз колдонгон башка трансформациялоо функциялары glTranslatef () жана glScalef (). Алар glRotatef () окшош, бирок алар үч гана параметрди талап кылат: x, y жана z баалуулуктары объекттин өлчөмүн жана масштабын өзгөртүү үчүн.
    • Бардык үч нерсе тең бир объектке туура көрсөтүлүшү үчүн, сиз өзгөртүүлөрдү тиешелүү тартипте орнотушуңуз керек, тактап айтканда glTranslate, glRotate, glScale - жана башка эч качан. OpenGL программаны төмөндөн өйдө карай окуу менен объектти өзгөртөт. Муну жакшыраак түшүнүү үчүн, OpenGL аларды көрсөтүлгөн тартипте (жогорудан ылдый) колдонгондо, 1x1x1 кубу бардык өзгөрүүлөргө кандай караарын элестетип көрүңүз, анан OpenGL көрсөтмөлөрдү төмөндөн өйдө карай окуп, кубду кантип иштетерин ойлонуп көрүңүз.
  3. 3 Кубду x жана y багыттары боюнча эки жолу масштабдоо, кубикти y огунда 180 градуска буруу жана x огунда 0,1 кубду жылдыруу үчүн төмөнкү буйруктарды кошуңуз. Бардык тиешелүү буйруктар, анын ичинде мурда берилген glRotate () командалары туура тартипте экенине ынангыла. Эгер ката кетирүүдөн корксоңуз, макаланын аягындагы программанын акыркы версиясын караңыз.

      // More Transformations glTranslatef (0.1, 0.0, 0.0); glRotatef (180, 0.0, 1.0, 0.0); glScalef (2.0, 2.0, 0.0);

  4. 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. 5 Акыркы кодду текшериңиз. Бул жерде комментарийлерди которбогон макаланын автору тарабынан түзүлгөн акыркы код.

      // // Файл: mycube.c // Автор: Мэтт Дейсли // Түзүлгөн: 25.04.2012 // Долбоор: OpenGLде Куб жасоо үчүн баштапкы код // Сүрөттөмө: OpenGL терезесин түзүп, 3D кубун тартат/ / Колдонуучу жебе баскычтарын колдонуп айлана алат // // Башкаруулар: Сол жебе -Солго буруу // Оңго жебе -Оңго буруу // Өйдөгө өйдө кароо -------------------------------------------------- -// камтыйт // -------------------------------------------- -------------- #кошуу stdio.h> #кошуу stdarg.h> #математиканы кошуу.h> #аныктоо GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #GLUT / glut.h> #башка #камтыйт GL / glut.h> #endif // ---------------------------------------- ------------------ // Функциянын прототиптери // -------------------------- -------------------------------- void display (); Void specialKeys (); // ------------------------------------------------ ---------- // Глобалдык өзгөрмөлөр // ---------------------------------- ------------------------ double rotate_y = 0; double rotate_x = 0; // ------------------------------------------------ ---------- // display () Callback функциясы // ------------------------------- --------------------------- void display () // Clear screen and Z-buffer glClear (GL_COLOR_BUFFER_BIT // ------ -------------------------------------------------- -// specialKeys () кайра чалуу функциясы // ---------------------------------------- ------------------ void specialKeys (int key, int x, int y) {// Оң жебе-эгерде (key == GLUT_KEY_RIGHT) rotate_y + айланууну 5 градуска жогорулатуу = 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_RGB