OpenGL არის მძლავრი 3D პროგრამირების ინსტრუმენტი, რომელიც გამოიყენება მარტივი პრიმიტივებისგან რთული სამგანზომილებიანი სცენების დასახატად. ეს სტატია გასწავლით თუ როგორ უნდა დახაზოთ მარტივი კუბი, რომლის დატრიალებაც შეგიძლიათ სამ განზომილებაში!
ამ პროექტისთვის დაგჭირდებათ კოდის რედაქტორი და C პროგრამირების გარკვეული ცოდნა.
ნაბიჯები
3 ნაწილი 1: საწყისი დაყენება
ნაბიჯი 1. დააინსტალირეთ OpenGL იმისათვის, რომ დაიწყოთ მიჰყევით ამ ნაბიჯებს თქვენს სისტემაში OpenGL დაყენების მიზნით
თუ თქვენ უკვე გაქვთ OpenGL, ასევე თავსებადი C შემდგენელი დაინსტალირებული, შეგიძლიათ გამოტოვოთ ეს ნაბიჯი და გადადით შემდეგზე.
ნაბიჯი 2. შექმენით დოკუმენტი
შექმენით ახალი ფაილი თქვენს საყვარელ კოდის რედაქტორში და შეინახეთ როგორც mycube.c
ნაბიჯი 3. დაამატეთ #მოიცავს
ეს არის ძირითადი კომპონენტები, რომლებიც დაგჭირდებათ თქვენი პროგრამისთვის. მნიშვნელოვანია გავაცნობიეროთ, რომ სხვადასხვა ოპერაციული სისტემებისთვის საჭირო სხვადასხვა კომპონენტია. დარწმუნდით, რომ შეიტანეთ ეს ყველაფერი იმის უზრუნველსაყოფად, რომ თქვენი პროგრამა მრავალმხრივია და მისი გამოყენება შესაძლებელია ნებისმიერი მომხმარებლისთვის.
// მოიცავს #მოიცავს #მოიცავს #მოიცავს #მოიცავს #განსაზღვრეთ GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #მოიცავს #სხვა #მოიცავს #endif
ნაბიჯი 4. დაამატეთ ფუნქციის პროტოტიპები და გლობალური ცვლადები
თქვენი შემდეგი ნაბიჯი არის ფუნქციის პროტოტიპების გამოცხადება.
// ფუნქციის პროტოტიპები void ჩვენება (); void specialKeys (); // გლობალური ცვლადები ორმაგად ბრუნავს_y = 0; ორმაგი ბრუნვა_ x = 0;
ნაბიჯი 5. დააყენეთ ძირითადი () ფუნქცია
int main (int argc, char* argv ) {// GLUT ინიციალიზაცია და მომხმარებლის პარამეტრების დამუშავება glutInit (& argc, argv); // მოითხოვეთ ორმაგი ბუფერული ნამდვილი ფერის ფანჯარა Z- ბუფერული glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
ნაბიჯი 6. ფანჯრის შექმნა
შემდეგი ნაბიჯი არის ფანჯრის შექმნა რომლის ფარგლებშიც თქვენ დახაზავთ კუბს. ამ გაკვეთილში ფანჯარას ჰქვია "გასაოცარი კუბი".
// შექმენით ფანჯარა glutCreateWindow ("გასაოცარია კუბი");
ნაბიჯი 7. ჩართეთ სიღრმისეული ტესტი
OpenGL არის მკაცრი ენა, რადგან ის არ ითვალისწინებს რაიმე სპეციალური ფუნქციის ჩართვას. იმისათვის, რომ თქვენი პროგრამა სწორად გამოჩნდეს 3 განზომილებაში Z- ბუფერის გამოყენებით, რომელსაც ადრე უყურებდით, თქვენ გჭირდებათ ჩართეთ სიღრმისეული ტესტი რა OpenGL– ის შესწავლისას თქვენ აღმოაჩენთ ბევრ მახასიათებელს, რომლის ჩართვაც დაგჭირდებათ, მათ შორის განათება, ტექსტურა, მოპირკეთება და მრავალი სხვა.
// ჩართეთ Z- ბუფერული სიღრმის ტესტი glEnable (GL_DEPTH_TEST);
ნაბიჯი 8. დაამატეთ გამოძახების ფუნქციები
აქ არის უკუკავშირის ფუნქციები, რომელზეც ადრე დაწერეთ პროტოტიპები. ყოველ ჯერზე ძირითადი მარყუჟის მეშვეობით, ეს ფუნქციები გამოიძახება. ჩვენების ფუნქცია ხატავს სცენას ცვლადების ნებისმიერი ცვლილების საფუძველზე, რომელიც განხორციელდა წინა ზარის შემდეგ. SpecialKeys ფუნქცია საშუალებას გვაძლევს ვითანამშრომლოთ პროგრამასთან.
// უკუკავშირის ფუნქციები glutDisplayFunc (ჩვენება); glutSpecialFunc (specialKeys);
ნაბიჯი 9. დაიწყეთ MainLoop
ეს გაიხსენებს ძირითად ფუნქციას, სანამ არ დახურავთ პროგრამას ანიმაციებისა და მომხმარებლის ურთიერთქმედების საშუალებას.
// გადასცეს კონტროლი GLUT– ზე glutMainLoop მოვლენებისთვის (); // OS– ზე დაბრუნება return 0; }
3 ნაწილი 2: ჩვენება () ფუნქცია
ნაბიჯი 1. გაიაზრეთ ამ ფუნქციის მიზანი
თქვენი კუბიკის დახატვის ყველა სამუშაო შესრულდება ამ ფუნქციით. კუბის მიღმა არსებული ზოგადი იდეა არის ექვსივე მხარის ინდივიდუალურად დახატვა და შესაბამის პოზიციაში განთავსება.
კონცეპტუალურად, თითოეული მხარე დახატული იქნება ოთხი კუთხის განსაზღვრით და OpenGL- ს საშუალებას აძლევს დააკავშიროს ხაზები და შეავსოს იგი თქვენ მიერ განსაზღვრული ფერით. ქვემოთ მოცემულია ნაბიჯები ამის გასაკეთებლად
ნაბიჯი 2. დაამატეთ glClear ()
პირველი ნაბიჯი, რაც თქვენ უნდა გადადოთ ამ ფუნქციის შესასრულებლად არის გაასუფთავეთ ფერი და Z ბუფერი რა ამ ნაბიჯების გარეშე, ძველი ნახატები კვლავ ხილული იქნება ახალი ნახატების ქვეშ და დახატული საგნები არ იქნება ეკრანზე სწორ ადგილას.
ბათილი ჩვენება () {// ეკრანის გასუფთავება და Z- ბუფერი glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
ნაბიჯი 3. დაამატეთ glBegin () და glEnd ()
OpenGL განსაზღვრავს ობიექტებს, როგორც სხვადასხვა მრავალკუთხედის კომბინაციას. Გამოყენებით glBegin () ბრძანება, თქვენ ეფექტურად დადეთ ფანქარი, რომელიც დახატავს ფორმას. ფანქრის ასამაღლებლად და ახალი ფორმის დასაწყებად, თქვენ უნდა გამოიყენოთ glEnd () ბრძანება. ამ სახელმძღვანელოში თქვენ გამოიყენებთ GL_POLYGON- ს კუბის თითოეული მხარის დასახატად, მაგრამ შესაძლებელია სხვა პარამეტრების გამოყენება, როგორიცაა GL_LINE, GL_QUAD, ან GL_TRIANGLE სხვა ფორმების შესაქმნელად.
- აქ თქვენ დაიწყებთ კუბის წინა ნაწილით. მოგვიანებით თქვენ დაამატებთ ფერს ექვსივე მხარეს.
// მრავალ ფერადი მხარე - FRONT glBegin (GL_POLYGON); // ვერტიკები დაემატება შემდეგ საფეხურზე glEnd ();
ნაბიჯი 4. დაამატეთ glVertex3f ()
მას შემდეგ რაც განაცხადეთ, რომ გსურთ დაიწყოთ თქვენი მრავალკუთხედი, თქვენ უნდა წვეროების განსაზღვრა ობიექტის. glVertex– ს აქვს მრავალი ფორმა იმისდა მიხედვით, თუ რისი გაკეთება გსურთ თქვენს ობიექტთან.
- პირველი არის რამდენ განზომილებაში მუშაობთ. GlVertex3f– ში ზემოთ ნახსენები 3 ამბობს, რომ თქვენ ხატავთ 3 განზომილებაში. ასევე შესაძლებელია მუშაობა 2 ან 4 განზომილებაში. FV ზემოთ glVertex3f ამბობს, რომ თქვენ მუშაობთ მცურავი წერტილების რიცხვებთან. თქვენ ასევე შეგიძლიათ გამოიყენოთ შორტები, რიცხვები ან ორადგილიანი.
- გაითვალისწინეთ, რომ ეს წერტილები განსაზღვრულია ა საათის ისრის საწინააღმდეგოდ მანერა. ეს არ არის ძალიან მნიშვნელოვანი ამ მომენტში, მაგრამ როდესაც თქვენ დაიწყებთ მუშაობას განათებით, ტექსტურით და მოპირკეთებით, ეს წარმოუდგენლად მნიშვნელოვანი გახდება, ასე რომ მიეჩვიეთ ჩვევას განსაზღვროთ თქვენი ქულები საათის ისრის საწინააღმდეგოდ.
- დაამატეთ დაამატეთ წვეროები 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 -ს გახდის წერტილს თეთრს. 3 in glColor3f () ეხება 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 (); // მეწამული მხარე - RIGHT 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 ()
თქვენ თითქმის დასრულებული ხართ, მაგრამ ამ მომენტისთვის თქვენ შეგიძლიათ დახაზოთ კუბი, მაგრამ არ გაქვთ მისი ბრუნვის საშუალება. ამისათვის თქვენ შექმენით სპეციალური კლავიშები () ფუნქცია საშუალებას გვაძლევს დააჭიროთ ისრის ღილაკებს და გადავაბრუნოთ კუბი!
- ეს ფუნქციაა იმის გამო, რომ თქვენ გამოაცხადეთ გლობალური ცვლადები rotate_x და rotate_y. როდესაც დააჭირეთ მარჯვენა და მარცხენა ისრის ღილაკებს, rotate_y გაიზრდება ან შემცირდება 5 გრადუსით. ანალოგიურად, როდესაც დააჭირეთ ზევით და ქვემოთ ისრის ღილაკებს, rotate_x შესაბამისად შეიცვლება.
void specialKeys (int გასაღები, int x, int y) {// მარჯვენა ისარი - გაზრდის ბრუნვას 5 გრადუსით, თუ (გასაღები == GLUT_KEY_RIGHT) ბრუნავს_y += 5; // მარცხენა ისარი - შეამცირეთ ბრუნვა 5 გრადუსით სხვა შემთხვევაში, თუ (გასაღები == GLUT_KEY_LEFT) ბრუნავს_ი - = 5; სხვა შემთხვევაში თუ (გასაღები == GLUT_KEY_UP) როტაცია_ x += 5; სხვა შემთხვევაში თუ (გასაღები == GLUT_KEY_DOWN) როტაცია_ x -= 5; // მოითხოვეთ ჩვენების განახლება glutPostRedisplay (); }
ნაბიჯი 2. დაამატეთ glRotate ()
თქვენი ბოლო განცხადება არის განცხადების დამატება, რომელიც გადაატრიალებს თქვენს ობიექტს. დაუბრუნდით ჩვენების () ფუნქციას და FRONT- ის წინ დაამატეთ ეს ხაზები:
// გარდაქმნების გადატვირთვა 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 x ღერძის გასწვრივ, 2 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. შეადგინეთ და გაუშვით თქვენი კოდი
დავუშვათ, რომ თქვენ იყენებთ 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. შეამოწმეთ თქვენი სრული კოდი
ეს ასე უნდა იყოს:
// // ფაილი: mycube.c // ავტორი: Matt Daisley // შეიქმნა: 4/25/2012 // პროექტი: Source code for Cube in OpenGL // აღწერა: ქმნის OpenGL ფანჯარას და ხატავს 3D კუბს/ / რომ მომხმარებელს შეუძლია ბრუნვა ისრის ღილაკების გამოყენებით // // კონტროლი: მარცხენა ისარი -როტაცია მარცხნივ // მარჯვენა ისარი -როტაცია მარჯვნივ // ზემოთ ისარი -როტაცია ზემოთ // ქვემოთ ისარი -როტაცია ქვემოთ // ------ ------------------------------------------------------ -// მოიცავს // ----------------------------------------------- -------- ---------------------------------------------- // ფუნქციის პროტოტიპები / / ----------------------------------------------------- --------- ბათილი ჩვენება (); void specialKeys (); // ---------------------------------------------------- ---------- // გლობალური ცვლადები // -------------------------------------- ------------------------ ორმაგი როტაცია_y = 0; ორმაგი ბრუნვა_ x = 0; // ---------------------------------------------------- ---------- // ჩვენება () გამოძახების ფუნქცია // ----------------------------------- --------------------------- ბათილი ჩვენება () {// ეკრანის გასუფთავება და 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 (); // მეწამული მხარე - RIGHT 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 გასაღები, int x, int y) {// მარჯვენა ისარი-როტაციის გაზრდა 5-ით ხარისხი თუ (გასაღები == GLUT_KEY_RIGHT) როტაცია_ა += 5; // მარცხენა ისარი - შეამცირეთ ბრუნვა 5 გრადუსით სხვა შემთხვევაში, თუ (გასაღები == GLUT_KEY_LEFT) ბრუნავს_ი - = 5; სხვა შემთხვევაში თუ (გასაღები == GLUT_KEY_UP) როტაცია_ x += 5; სხვა შემთხვევაში თუ (გასაღები == GLUT_KEY_DOWN) როტაცია_ x -= 5; // მოითხოვეთ ჩვენების განახლება glutPostRedisplay (); } // -------------------------------------------------- ----------- // მთავარი ფუნქცია // ------------------------------- --------------------------- int main (int argc, char* argv ) {// GLUT ინიციალიზაცია და მომხმარებლის პარამეტრების დამუშავება glutInit (& argc, argv); // მოითხოვეთ ორმაგი ბუფერული ნამდვილი ფერის ფანჯარა Z- ბუფერული glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); // შექმენით ფანჯარა glutCreateWindow ("გასაოცარია კუბი"); // ჩართეთ Z- ბუფერული სიღრმის ტესტი glEnable (GL_DEPTH_TEST); // გამოძახების ფუნქციები glutDisplayFunc (ჩვენება); glutSpecialFunc (specialKeys); // გადასცეს კონტროლი GLUT– ზე glutMainLoop მოვლენებისთვის (); // OS– ზე დაბრუნება return 0; }