برنامج OpenGL للرسوم المتحركة البسيطة (الثورة) في C

برنامج OpenGL عبارة عن واجهة برمجة تطبيقات متعددة اللغات لتقديم رسومات متجهة ثنائية وثلاثية الأبعاد. باستخدام هذا يمكننا أن نجعل الكثير من التصميم وكذلك الرسوم المتحركة. فيما يلي الرسوم المتحركة البسيطة التي تم إنشاؤها باستخدام برنامج OpenGL .
يقترب :  
لتحريك الصورة، نحتاج إلى فهم إجراءات عمل الوظيفة المستخدمة للعرض، على سبيل المثال جلكلير(GL_COLOR_BUFFER_BIT) . وتتمثل مهمتها في مسح الشاشة بالقيمة الافتراضية بعد فترة زمنية معينة (عادة بعد 1/30 ثانية أو 1/60 ثانية). لذلك إذا حدث أي تغيير في الإحداثيات فسوف يبدو وكأنه يتحرك حيث أن العين البشرية لا تستطيع تمييز الصورة إلا التي يفصلها 1/16 ثانية (استمرار الرؤية).
الآن إحداثيات الدائرة هي X = r*cos(?) وY = r*sin(?) أو للقطع الناقص X = rx*cos(?) وY = ry*cos(?) حيث rx و ry هما نصف القطر في اتجاه X وY و ؟ هي الزاوية. 
إذا اختلفنا ؟ من 0 إلى 2*pi (360 درجة) بزيادة صغيرة جدًا (على سبيل المثال درجة واحدة) ورسم نقطة على هذا الإحداثي يمكننا إنشاء دائرة كاملة أو قطع ناقص. يمكننا أيضًا إنشاء نصف دائرة أو أي قوس من الدائرة أو القطع الناقص عن طريق تغيير قيمة البداية والنهاية ؟ (زاوية).
تُستخدم هذه المفاهيم لرسم الرسوم المتحركة التالية: 
 

  • يتم استخدام 7 أجزاء أفقية من القطع الناقص و3 قطع ناقص عمودي كامل بالإضافة إلى دائرة خارجية واحدة وقطع ناقص خارجي واحد لتصور مدار مرسوم عن طريق ضبط ؟ وكذلك نصف القطر.
  • يتم رسم خط عمودي واحد لتكوين الشكل. ثم لجعلها تتحرك يتم إعطاء حلقة أخرى حيث تتغير قيمة j بكمية صغيرة جدًا لجعل الحركة أكثر سلاسة.
  • نظرًا لأنه كان علينا أن نجعل كل النقاط تتحرك بنفس نوع الحركة للحفاظ على الشكل معًا، فهي معادلة الحركة Glyx2i(x/2 - 600*cos(j) من/2 - 100*sin(j)) ويعطى داخل كل الداخلية للحلقة بحيث يمكن تطبيقه على جميع النقاط تماما.


للعمل على نظام التشغيل Ubuntu:  
 

  gcc filename.c -lGL -lGLU -lglut -lm   where filename.c is the name of the file with which this program is saved. 


 


أدناه هو التنفيذ في C.
 

C
   // C Program to illustrate    // OpenGL animation for revolution   #include      #include      #include      // global declaration   int     x       y  ;   float     i       j  ;   // Initialization function   void     myInit     (  void  )   {      // Reset background color with black (since all three argument is 0.0)      glClearColor  (  0.0       0.0       0.0       1.0  );          // Set picture color to green (in RGB model)      // as only argument corresponding to G (Green) is 1.0 and rest are 0.0      glColor3f  (  0.0       1.0       0.0  );          // Set width of point to one unit      glPointSize  (  1.0  );      glMatrixMode  (  GL_PROJECTION  );      glLoadIdentity  ();          // Set window size in X- and Y- direction      gluOrtho2D  (  -780       780       -420       420  );   }   // Function to display animation   void     display     (  void  )   {      // Outer loop to make figure moving      // loop variable j iterated up to 10000      // indicating that figure will be in motion for large amount of time      // around 10000/6.29 = 1590 time it will revolve      // j is incremented by small value to make motion smoother      for     (  j     =     0  ;     j      <     10000  ;     j     +=     0.01  )      {      glClear  (  GL_COLOR_BUFFER_BIT  );      glBegin  (  GL_POINTS  );          // Iterate i up to 2*pi i.e. 360 degree      // plot point with slight increment in angle      // so it will look like a continuous figure      // Loop is to draw outer circle      for     (  i     =     0  ;  i      <     6.29  ;  i     +=     0.001  )      {      x     =     200     *     cos  (  i  );      y     =     200     *     sin  (  i  );      glVertex2i  (  x       y  );          // For every loop 2nd glVertex function is      // to make smaller figure in motion      glVertex2i  (  x     /     2     -     600     *     cos  (  j  )     y     /     2     -     100     *     sin  (  j  ));      }          // 7 loops to draw parallel latitude      for     (  i     =     1.17  ;     i      <     1.97  ;     i     +=     0.001  )      {      x     =     400     *     cos  (  i  );      y     =     -150     +     300     *     sin  (  i  );      glVertex2i  (  x       y  );      glVertex2i  (  x     /     2     -     600     *     cos  (  j  )     y     /     2     -     100     *     sin  (  j  ));      }          for     (  i     =     1.07  ;     i      <     2.07  ;     i     +=     0.001  )      {      x     =     400     *     cos  (  i  );      y     =     -200     +     300     *     sin  (  i  );      glVertex2i  (  x       y  );      glVertex2i  (  x     /     2     -     600     *     cos  (  j  )     y     /     2     -     100     *     sin  (  j  ));      }          for     (  i     =     1.05  ;     i      <     2.09  ;     i     +=     0.001  )      {      x     =     400     *     cos  (  i  );      y     =     -250     +     300     *     sin  (  i  );      glVertex2i  (  x       y  );      glVertex2i  (  x     /     2     -     600     *     cos  (  j  )     y     /     2     -     100     *     sin  (  j  ));      }          for     (  i     =     1.06  ;     i      <     2.08  ;     i     +=     0.001  )      {      x     =     400     *     cos  (  i  );      y     =     -300     +     300     *     sin  (  i  );      glVertex2i  (  x       y  );      glVertex2i  (  x     /     2     -     600     *     cos  (  j  )     y     /     2     -     100     *     sin  (  j  ));      }          for     (  i     =     1.10  ;     i      <     2.04  ;     i     +=     0.001  )      {      x     =     400     *     cos  (  i  );      y     =     -350     +     300     *     sin  (  i  );      glVertex2i  (  x       y  );      glVertex2i  (  x     /     2     -     600     *     cos  (  j  )     y     /     2     -     100     *     sin  (  j  ));      }          for     (  i     =     1.16  ;     i      <     1.98  ;     i     +=     0.001  )      {      x     =     400     *     cos  (  i  );      y     =     -400     +     300     *     sin  (  i  );      glVertex2i  (  x       y  );      glVertex2i  (  x     /     2     -     600     *     cos  (  j  )     y     /     2     -     100     *     sin  (  j  ));      }          for     (  i     =     1.27  ;     i      <     1.87  ;     i     +=     0.001  )      {      x     =     400     *     cos  (  i  );      y     =     -450     +     300     *     sin  (  i  );      glVertex2i  (  x       y  );      glVertex2i  (  x     /     2     -     600     *     cos  (  j  )     y     /     2     -     100     *     sin  (  j  ));      }          // Loop is to draw vertical line      for     (  i     =     200  ;     i     >=-     200  ;     i  --  )      {      glVertex2i  (  0       i  );      glVertex2i  (  -600     *     cos  (  j  )     i     /     2     -     100     *     sin  (  j  ));      }          // 3 loops to draw vertical ellipse (similar to longitude)      for     (  i     =     0  ;  i      <     6.29  ;     i     +=     0.001  )      {      x     =     70     *     cos  (  i  );      y     =     200     *     sin  (  i  );      glVertex2i  (  x       y  );      glVertex2i  (  x     /     2     -     600     *     cos  (  j  )     y     /     2     -     100     *     sin  (  j  ));      }          for     (  i     =     0  ;     i      <     6.29  ;     i     +=     0.001  )      {      x     =     120     *     cos  (  i  );      y     =     200     *     sin  (  i  );      glVertex2i  (  x       y  );      glVertex2i  (  x     /     2     -     600     *     cos  (  j  )     y     /     2     -     100     *     sin  (  j  ));      }          for     (  i     =     0  ;     i      <     6.29  ;     i     +=     0.001  )      {      x     =     160     *     cos  (  i  );      y     =     200     *     sin  (  i  );      glVertex2i  (  x       y  );      glVertex2i  (  x     /     2     -     600     *     cos  (  j  )     y     /     2     -     100     *     sin  (  j  ));      }          // Loop to make orbit of revolution      for     (  i     =     0  ;     i      <     6.29  ;     i     +=     0.001  )      {      x     =     600     *     cos  (  i  );      y     =     100     *     sin  (  i  );      glVertex2i  (  x       y  );      }      glEnd  ();      glFlush  ();      }   }   // Driver Program   int     main     (  int     argc       char  **     argv  )   {      glutInit  (  &  argc       argv  );          // Display mode which is of RGB (Red Green Blue) type      glutInitDisplayMode  (  GLUT_SINGLE     |     GLUT_RGB  );          // Declares window size      glutInitWindowSize  (  1360       768  );          // Declares window position which is (0 0)      // means lower left corner will indicate position (0 0)      glutInitWindowPosition  (  0       0  );      // Name to window      glutCreateWindow  (  'Revolution'  );      // Call to myInit()      myInit  ();      glutDisplayFunc  (  display  );      glutMainLoop  ();   }   


 

إنشاء اختبار