Чӣ тавр як кубро дар OpenGL сохтан мумкин аст

Муаллиф: Gregory Harris
Санаи Таъсис: 12 Апрел 2021
Навсозӣ: 1 Июл 2024
Anonim
Чӣ тавр як кубро дар OpenGL сохтан мумкин аст - Ҷомеа
Чӣ тавр як кубро дар OpenGL сохтан мумкин аст - Ҷомеа

Мундариҷа

OpenGL як воситаи барномасозии 3D мебошад, ки ба шумо имкон медиҳад тасвирҳои мураккаби 3D -ро аз шаклҳои оддӣ эҷод кунед. Дар ин мақола, шумо мефаҳмед, ки бо ёрии ӯ як куби оддиро, ки дар се андоза гардиш кардан мумкин аст, кашед!

Қадамҳо

Қисми 1 аз 3: Насби аввал

  1. 1 OpenGL насб кунед. Оғози омӯзиш дар бораи насб кардани OpenGL дар компютери шумо. Агар шумо аллакай OpenGL ва компилятор C дошта бошед, шумо метавонед ин қадамро гузаред ва ба марҳилаи дигар гузаред.
  2. 2 Ҳуҷҷат эҷод кунед. Дар муҳаррири рамзи дӯстдоштаи худ файли нав созед ва онро ҳамчун mycube.c захира кунед
  3. 3 Илова #мегирад. Инҳо дастурҳои асосии #include ба шумо лозиманд. Дар хотир доштан муҳим аст, ки дастурҳои системаҳои гуногуни амалиётӣ гуногунанд ва аз ин рӯ, шумо бояд ҳама чизро интихоб кунед, то ин ки барнома универсалӣ бошад ва онро дар ҳама гуна система иҷро кардан мумкин аст.

      // Мегирад #include stdio.h> #include stdarg.h> #include math.h> #dell GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #else #include GL / glut.h> #endif

  4. 4 Прототипҳои функсионалӣ ва глобалҳоро илова кунед. Қадами навбатӣ эълон кардани прототипҳои функсионалӣ мебошад.

      // Намунаи прототипҳои функсионалӣ ботил (); ботил specialKeys (); // Тағирёбандаҳои глобалӣ дукарата rotate_y = 0; дугона rotate_x = 0;

  5. 5 Функсияи main () -ро муайян кунед.

      int main (int argc, char * argv []) // GLUT -ро оғоз кунед ва параметрҳои фармоишии glutInit -ро коркард кунед (& argc, argv); // Дархост кардани равзана бо дастгирии буферии дукарата, буферии Z-буферӣ ва glutInitDisplayMode (GLUT_DOUBLE)

Қисми 2 аз 3: Функсияи дисплей ()

  1. 1 Мақсади функсияи display () -ро фаҳмед. Ҳама корҳо оид ба расонидани куб ба хатҳои нозуки ин вазифа хоҳанд афтод. Идеяи умумӣ ин аст: шумо шаш чеҳраи алоҳидаи кубро мекашед ва онҳоро дар ҷойҳои мувофиқ ҷойгир мекунед.
    • Барои ҳар як чеҳра шумо чор кунҷро муайян хоҳед кард ва OpenGL онҳоро бо хатҳо пайваст мекунад ва онҳоро бо ранги интихобкардаи худ пур мекунад. Чӣ тавр ин корро кардан дар зер шарҳ дода мешавад.
  2. 2 Функсияи glClear () -ро илова кунед. Пеш аз ҳама, ҳангоми кор бо ин функсия ба мо лозим аст ранги равшан ва z-буфер... Бе ин, тасвири кӯҳна дар зери тасвири нав намоён хоҳад шуд ва объектҳои бо барнома кашидашуда нодуруст ҷойгир карда мешаванд.

      Намоиши бекор () // Тоза кардани экран ва 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, 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 (). Охирин коре, ки мо мекунем ин илова кардани сатрест, ки ба мо имкон медиҳад гардиши ашёро таъмин кунем. Бозгашт ба функсия намоиш () ва пеш аз тавсифи тарафи ФРОНТ илова кунед:

      // 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 ва гардиш дар меҳвари у ҳамчун тағирёбии арзиши rotate_y муаррифӣ мекунем. Бо вуҷуди ин, OpenGL ҳама чизро ба як матритсаи табдилдиҳӣ муттаҳид мекунад. Ҳар дафъае, ки шумо ба намоиш занг мезанед, шумо матритсаи трансформатсия эҷод мекунед ва glLoadIdentity () ба шумо имкон медиҳад, ки ҳар дафъа бо матритсаи нав оғоз кунед.
    • Дигар вазифаҳои табдилдиҳӣ, ки шумо шояд истифода бурдаед, glTranslatef () ва glScalef () мебошанд. Онҳо ба glRotatef () шабеҳанд, ба истиснои он ки онҳо танҳо се параметрро талаб мекунанд: барои тағир додани андоза ва миқёси объект арзиши x, y ва z.
    • Барои он ки ҳама чиз дуруст намоиш дода шавад, вақте ки ҳар се тағирот ба як объект татбиқ карда мешаванд, шумо бояд тағиротро бо тартиби мувофиқ танзим кунед, яъне glTranslate, glRotate, glScale - ва ҳеҷ гоҳ ба таври дигар. OpenGL объектро тавассути хондани барнома аз поён ба боло табдил медиҳад. Барои беҳтар фаҳмидани ин, тасаввур кунед, ки куби 1x1x1 пас аз ҳама тағиротҳо чӣ гуна хоҳад буд, агар OpenGL онҳоро бо тартиби нишон додашуда (аз боло ба поён) татбиқ кунад ва пас дар бораи он фикр кунед, ки OpenGL кубро бо хондани дастурҳо аз поён то боло чӣ гуна коркард мекунад.
  3. 3 Фармонҳои зеринро илова кунед, то кубро дар самтҳои x ва y ду маротиба миқёс диҳед, кубро дар меҳвари y 180 дараҷа гардонед ва кубро дар меҳвари x 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 -framework GLUT -framework OpenGL ./ mycube Дар Windows: gcc -Wall -ofoo foo.c -lglut32cu - lglu32 -lopengl32 ./ mycube

  5. 5 Рамзи ниҳоиро тафтиш кунед. Ин аст рамзи ниҳоӣ, ки муаллифи мақола сохтааст, ки шарҳҳоро тарҷума намекунад.

      // // Файл: mycube.c // Муаллиф: Мат Дэйсли // Cохта шуд: 25/25/2012 // Лоиҳа: Рамзи манбаъ барои сохтани куб дар OpenGL // Тавсиф: Равзанаи OpenGL месозад ва куби 3D мекашад/ / Ки корбар метавонад бо истифода аз тугмаҳои тир чарх занад // // Усулҳои идоракунӣ: Ақрабаки чап -Тоб гардиш ба чап // Тирчаи рост -Тоб гардондан ба боло -------------------------------------------------- -// Дар бар мегирад // -------------------------------------------- -------------- #incdlude stdio.h> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #se # #include GL / glut.h> #endif // ---------------------------------------- ------------------ // Прототипҳои функсия // -------------------------- -------------------------------- Намоиши ботил (); ботил specialKeys (); // ------------------------------------------------ ---------- // Тағирёбандаҳои глобалӣ // ---------------------------------- ------------------------ гардиши дугона_y = 0; дугона rotate_x = 0; // ------------------------------------------------ ---------- // display () Функсияи бозгашт // ------------------------------- --------------------------- Намоиши ботил () // Экрани тоза ва Z-буфер glClear (GL_COLOR_BUFFER_BIT // ------ -------------------------------------------------- -// specialKeys () Функсияи Callback // ---------------------------------------- ------------------ void specialKeys (int key, int x, int y) {// Тири рост-гардишро 5 дараҷа зиёд кунед, агар (key == 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; // Навсозии намоишро дархост кунед glutPostRedisplay ();} // ------------------------------------ ---------------------- // функсияи main () // -------------------- -------------------------------------- int main (int argc, char * argv [] ) GLUT_RGB