OpenGL -де текшені қалай жасауға болады

Автор: Gregory Harris
Жасалған Күн: 12 Сәуір 2021
Жаңарту Күні: 26 Маусым 2024
Anonim
OpenGL -де текшені қалай жасауға болады - Қоғам
OpenGL -де текшені қалай жасауға болады - Қоғам

Мазмұны

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> #delline GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #else #include GL / glut.h> #endif

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

      // void display функционалды прототиптері (); жарамсыз specialKeys (); // Жаһандық айнымалылар double rotate_y = 0; қос айналдыру_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; әйтпесе (key == GLUT_KEY_UP) rotate_x + = 5; әйтпесе (key == GLUT_KEY_DOWN) rotate_x - = 5; // Экранды жаңартуды сұрау glutPostRedisplay (); }

  2. 2 GlRotate () қосыңыз. Біз жасай алатын соңғы нәрсе - бұл объектіні айналдыруға мүмкіндік беретін жолды қосу. Функция дегенге қайта келу көрсету () және FRONT жағының сипаттамасынан бұрын мынаны қосыңыз:

      // 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. Әзірге бізге текшені екі ось бойынша айналдыру керек, х және у.
    • Біз бағдарламада анықтайтын барлық түрлендірулер ұқсас жолдарды қажет етеді. Негізінде, біз объектінің х осі бойымен айналуын 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 градусқа бұру үшін және 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. 4 Кодты құрастырыңыз және іске қосыңыз. Сіз компилятор ретінде gcc пайдаланасыз делік, сондықтан терминалға келесі пәрмендерді енгізіңіз:

      Linux жүйесінде: gcc cube.c -o текше -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 қосу GL / glut.h> #endif // ---------------------------------------- ------------------ // Функцияның прототиптері // -------------------------- -------------------------------- жарамсыз дисплей (); жарамсыз specialKeys (); // ------------------------------------------------ ---------- // Жаһандық айнымалылар // ---------------------------------- ------------------------ қос бұру_y = 0; қос айналдыру_x = 0; // ------------------------------------------------ ---------- // display () кері шақыру функциясы // ------------------------------- --------------------------- void display () // Clear screen and Z-buffer glClear (GL_COLOR_BUFFER_BIT // ------ -------------------------------------------------- -// specialKeys () кері шақыру функциясы // ---------------------------------------- ------------------ void specialKeys (int key, int x, int y) {// Оң жақ көрсеткі-егер айналдыруды 5 градусқа жоғарылатса (key == GLUT_KEY_RIGHT) rotate_y + = 5; // Сол жақ көрсеткі - бұрылысты 5 градусқа басқа төмендету, егер (кілт == GLUT_KEY_LEFT) rotate_y - = 5; басқасы (key == GLUT_KEY_UP) rotate_x + = 5; басқасы болса (key == GLUT_KEY_DOWN) rotate_x - = 5; // glutPostRedisplay () көрсетуді жаңартуды сұрау;} // ------------------------------------ ---------------------- // main () функциясы // -------------------- -------------------------------------- int main (int argc, char * argv [] ) GLUT_RGB