Ինչպես պատրաստել խորանարդ OpenGL- ում

Հեղինակ: Gregory Harris
Ստեղծման Ամսաթիվը: 12 Ապրիլ 2021
Թարմացման Ամսաթիվը: 1 Հուլիս 2024
Anonim
Տավուշցի «Էյնշտեյնը» խոստանում է «արդարացնել» հույսերը
Տեսանյութ: Տավուշցի «Էյնշտեյնը» խոստանում է «արդարացնել» հույսերը

Բովանդակություն

OpenGL- ը 3D ծրագրավորման գործիք է, որը թույլ է տալիս պարզ ձևերից ստեղծել բարդ 3D պատկերներ: Այս հոդվածից դուք կսովորեք, թե ինչպես նկարել նրա օգնությամբ մի պարզ խորանարդ, որը կարող է պտտվել երեք հարթություններում:

Քայլեր

Մաս 1 -ից 3 -ից. Նախնական տեղադրում

  1. 1 Տեղադրեք OpenGL: Սկսեք ձեռնարկից, թե ինչպես տեղադրել OpenGL ձեր համակարգչում: Եթե ​​արդեն ունեք OpenGL և C կոմպիլյատոր, կարող եք բաց թողնել այս քայլը և անցնել հաջորդին:
  2. 2 Ստեղծեք փաստաթուղթ: Ստեղծեք նոր ֆայլ ձեր նախընտրած կոդերի խմբագրիչում և պահեք այն որպես mycube.c
  3. 3 Ավելացնել #ներառում: Ահա հիմնական #ներառեք այն հրահանգները, որոնք ձեզ անհրաժեշտ կլինեն: Կարևոր է հիշել, որ տարբեր օպերացիոն համակարգերի հրահանգները տարբեր են, և, հետևաբար, դուք պետք է ընտրեք ամեն ինչ, որպեսզի ծրագիրը համընդհանուր լինի և կարող է գործարկվել ցանկացած համակարգի վրա:

      // Ներառում է #include stdio.h> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ #include GLUT / glut.h> #else #include GL / glut.h> #endif

  4. 4 Ավելացրեք ֆունկցիոնալ նախատիպեր և գլոբալներ: Հաջորդ քայլը ֆունկցիոնալ նախատիպերի հայտարարումն է:

      // Ֆունկցիոնալ նախատիպեր void display (); void specialKeys (); // Գլոբալ փոփոխականները կրկնակի պտտվում են_y = 0; կրկնակի պտտել_ x = 0;

  5. 5 Սահմանեք հիմնական () գործառույթը:

      int main (int argc, char * argv []) // Initialize GLUT և մշակել անհատական ​​պարամետրեր glutInit (& argc, argv); // Պահանջեք պատուհան `կրկնակի բուֆերավորման, Z- բուֆերավորման և իսկական գույնի ավելորդ աջակցության համար (GLUT_DOUBLE

Մաս 2 -ից 3 -ից. Displayուցադրման () գործառույթը

  1. 1 Հասկացեք ցուցադրման () գործառույթի նպատակը: Խորանարդը մատուցելու ամբողջ աշխատանքը կընկնի այս ֆունկցիայի փխրուն գծերի վրա: Ընդհանուր գաղափարը սա է. Դուք գծեք խորանարդի վեց առանձին երես և տեղադրեք դրանք իրենց համապատասխան դիրքերում:
    • Յուրաքանչյուր դեմքի համար դուք կսահմանեք չորս անկյուն, իսկ OpenGL- ը դրանք կկապի տողերով և կլցնի դրանք ձեր ընտրած գույնով: Ինչպես դա անել, կբացատրվի ստորև:
  2. 2 Ավելացնել glClear () գործառույթը: Առաջին հերթին, այս գործառույթով աշխատելիս մեզ անհրաժեշտ է հստակ գույն և z- բուֆեր... Առանց դրա, հին պատկերը տեսանելի կլինի նոր նկարի տակ, և ծրագրի գծած օբյեկտները սխալ տեղադրված կլինեն:

      դատարկ ցուցադրում () // Մաքրել էկրանը և Z բուֆերը glClear (GL_COLOR_BUFFER_BIT

    • Ուշադրություն դարձրեք վերջին երկու տողերին: Սրանք գործառույթներն են glFlush (); եւ glutSwapBuffers ();, տալով կրկնակի բուֆերացման ազդեցություն, որը նկարագրված էր վերևում:

3 -րդ մաս 3 -ից. Programրագրի ինտերակտիվություն

  1. 1 Ավելացնել հատուկKeys () գործառույթը: Սկզբունքորեն, ամեն ինչ գրեթե պատրաստ է, բայց խորանարդը միայն գծված է և ոչ թե պտտվող: Դա անելու համար հարկավոր է ստեղծել specialKeys () գործառույթը, որը թույլ կտա պտտել խորանարդը ՝ սեղմելով սլաքների ստեղները:
    • Այս գործառույթի համար է, որ գլոբալ փոփոխականները rotate_x և rotate_y հայտարարվել են: Երբ սեղմում եք ձախ և աջ սլաքների ստեղները, rotate_y արժեքը կբարձրանա կամ կնվազի հինգ աստիճանով: Rotate_x- ի արժեքը կփոխվի նույն կերպ, սակայն այս անգամ սեղմելով վեր ու վար սլաքների ստեղները:
    • void specialKeys (int key, int x, int y) {// Right arrow - մեծացնել պտույտը 5 աստիճանով, եթե (key == GLUT_KEY_RIGHT) rotate_y + = 5; // Ձախ սլաք - Նվազեցնել պտույտը 5 աստիճանով, եթե (բանալին == GLUT_KEY_LEFT) պտտել_յ - = 5; այլապես, եթե (բանալին == GLUT_KEY_UP) պտտել_ x + = 5; այլապես, եթե (բանալին == GLUT_KEY_DOWN) պտտել_ x - = 5; // Պահանջել Էկրանի թարմացման glutPostRedisplay (); }

  2. 2 Ավելացնել glRotate (): Վերջին բանը, որ մենք կանենք, ավելացնել մի գիծ, ​​որը թույլ կտա պտտել օբյեկտը: Վերադառնալ գործառույթին ցուցադրում () և նախքան ԱՌԱԻՆ կողմի նկարագրությունը ավելացնել.

      // Վերականգնել փոխակերպում glLoadIdentity (); // Պտտել, երբ օգտվողը փոխվում է Արժեքները rotate_x և rotate_y glRotatef (rotate_x, 1.0, 0.0, 0.0); glRotatef (պտտել_յ, 0.0, 1.0, 0.0); // Բազմագույն կողմ - ԱՌԱ ....

    • Խնդրում ենք նկատի ունենալ, որ շարահյուսությունը glRotatef ()որը նման է glColor3f () և glVertex3f () շարահյուսությանը, բայց միշտ պահանջում է չորս պարամետր: Առաջինը աստիճանների պտտման անկյունն է: Հաջորդ երեքը առանցքներն են, որոնց երկայնքով տեղի է ունենում պտույտը ՝ x, y, z կարգով: Առայժմ, մենք պետք է պտտենք խորանարդը երկու առանցքների ՝ x և y երկայնքով:
    • Բոլոր փոխակերպումները, որոնք մենք սահմանում ենք ծրագրում, պահանջում են նմանատիպ տողեր: Հիմնականում մենք ներկայացնում ենք օբյեկտի պտույտը x առանցքի երկայնքով ՝ որպես rotate_x արժեքի փոփոխություն, իսկ y առանցքի երկայնքով պտտումը ՝ որպես rotate_y արժեքի փոփոխություն: Այնուամենայնիվ, OpenGL- ը ամեն ինչ կկազմի մեկ փոխակերպման մատրիցայի մեջ: Ամեն անգամ, երբ դուք զանգահարում եք ցուցադրում, դուք կստեղծեք փոխակերպման մատրիցա և glLoadIdentity () թույլ կտա ամեն անգամ սկսել նոր մատրիցով:
    • Այլ փոխակերպման գործառույթներ, որոնք դուք կարող եք օգտագործել, glTranslatef () և glScalef () են: Նրանք նման են glRotatef () -ին, բացառությամբ, որ դրանք պահանջում են ընդամենը երեք պարամետր ՝ x, y և z արժեքները ՝ օբյեկտը չափափոխելու և մասշտաբավորելու համար:
    • Որպեսզի ամեն ինչ ճիշտ ցուցադրվի, երբ բոլոր երեք փոխակերպումները կիրառվեն մեկ օբյեկտի վրա, դուք պետք է փոխակերպումներ կատարեք համապատասխան կարգով, այն է. gl Թարգմանել, glRotate, glScale - և այլ կերպ երբեք: OpenGL- ը փոխակերպում է օբյեկտը ՝ ծրագիրը ներքևից վերև կարդալով: Սա ավելի լավ հասկանալու համար պատկերացրեք, թե ինչպիսին կլիներ 1x1x1 խորանարդը բոլոր փոխակերպումներից հետո, եթե OpenGL- ն դրանք կիրառեր ցուցադրված կարգով (վերևից ներքև), այնուհետև մտածեք, թե ինչպես OpenGL- ը կվերամշակեր խորանարդը ՝ ներքևից վերև կարդալով հրահանգները:
  3. 3 Ավելացրեք հետևյալ հրամանները ՝ խորանարդը երկու անգամ x և 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. 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. 5 Ստուգեք վերջնական կոդը: Ահա հոդվածի հեղինակի ստեղծած վերջնական կոդը, որը չի թարգմանում մեկնաբանությունները:

      // // Ֆայլ ՝ mycube.c // Հեղինակ ՝ Մեթ Դեյսլի // Ստեղծվել է ՝ 4/25/2012 // Նախագիծ. OpenGL- ում Cube պատրաստելու աղբյուրի կոդը // Նկարագրություն. Ստեղծում է OpenGL պատուհան և գծում 3D խորանարդ/ / Որ օգտվողը կարող է պտտվել ՝ օգտագործելով սլաքների ստեղները // // Կառավարում ՝ ձախ սլաք -պտտել ձախ // աջ սլաք -պտտել աջ // վերև սլաք -պտտել վեր // վար սլաք -պտտել ներքև // ------ ------------------------------------------------------ -// Ներառում է // ------------------------------------------------- ----------— GL / glut.h> #endif // --------------------------------------------- ------------------ // Ֆունկցիայի նախատիպեր // -------------------------- ------------------------------------ անվավեր ցուցադրում (); void specialKeys (); // ---------------------------------------------------- ---------- // Գլոբալ փոփոխականներ // -------------------------------------- ------------------------ կրկնակի պտտել_յ = 0; կրկնակի պտտել_ x = 0; // ---------------------------------------------------- ---------- // ցուցադրում () Հետադարձ կապի գործառույթ // ----------------------------------- --------------------------- անվավեր ցուցադրում () // Մաքրել էկրանը և Z-buffer glClear (GL_COLOR_BUFFER_BIT // ------ ------------------------------------------------------ -// specialKeys () Հետադարձ գործառույթ // ----------------------------------------- -------- = 5; // Ձախ սլաք - նվազեցրեք պտույտը 5 աստիճանով այլ դեպքում, եթե (ստեղն == GLUT_KEY_LEFT) պտտել_յ - = 5; հակառակ դեպքում, եթե (բանալին == GLUT_KEY_UP) պտտել_ x + = 5; հակառակ դեպքում, եթե (բանալին == GLUT_KEY_DOWN) պտտել_ x - = 5; // Հայցել ցուցադրման թարմացման glutPostRedisplay ();} // ------------------------------------ ---------------------- // հիմնական () գործառույթը // -------------------- -------------------------------------- int հիմնական (int argc, char * argv [] ) GLUT_RGB