كيفية صنع مكعب في برنامج OpenGL

مؤلف: Gregory Harris
تاريخ الخلق: 12 أبريل 2021
تاريخ التحديث: 1 تموز 2024
Anonim
OpenGL Tutorial 23 - Drawing A Cube
فيديو: OpenGL Tutorial 23 - Drawing A Cube

المحتوى

OpenGL هي أداة برمجة ثلاثية الأبعاد تتيح لك إنشاء صور ثلاثية الأبعاد معقدة من أشكال بسيطة. في هذه المقالة سوف تتعلم كيف ترسم بمساعدته مكعب بسيط يمكن تدويره بثلاثة أبعاد!

خطوات

جزء 1 من 3: التثبيت الأولي

  1. 1 قم بتثبيت برنامج OpenGL. ابدأ ببرنامج تعليمي حول كيفية تثبيت OpenGL على جهاز الكمبيوتر الخاص بك. إذا كان لديك بالفعل برنامج التحويل البرمجي OpenGL و C ، فيمكنك تخطي هذه الخطوة والانتقال إلى التالي.
  2. 2 قم بإنشاء مستند. قم بإنشاء ملف جديد في محرر الكود المفضل لديك واحفظه باسم mycube.c
  3. 3 أضف # يشتمل. فيما يلي التوجيهات الأساسية # include التي ستحتاج إليها. من المهم أن تتذكر أن التوجيهات الخاصة بأنظمة التشغيل المختلفة مختلفة ، وبالتالي تحتاج إلى اختيار كل شيء حتى يكون البرنامج عالميًا ويمكن تشغيله على أي نظام.

      // يشمل #include stdio.h> #include stdarg.h> #include math.h> #define GL_GLEXT_PROTOTYPES #ifdef __APPLE__ # include GLUT / glut.h> # else # تضمين GL / glut.h> #endif

  4. 4 أضف نماذج أولية وظيفية وكريات أرضية. الخطوة التالية هي الإعلان عن النماذج الأولية الوظيفية.

      // عرض باطل النماذج الوظيفية () ؛ مفاتيح خاصة باطلة () ؛ // المتغيرات العالمية double rotate_y = 0 ؛ rotate_x مزدوج = 0 ؛

  5. 5 حدد الوظيفة الرئيسية ().

      int main (int argc، char * argv []) // تهيئة GLUT ومعالجة المعلمات المخصصة glutInit (& argc، argv) ؛ // اطلب نافذة مع دعم التخزين المؤقت المزدوج والتخزين المؤقت Z والألوان الحقيقية glutInitDisplayMode (GLUT_DOUBLE

جزء 2 من 3: وظيفة العرض ()

  1. 1 افهم الغرض من وظيفة العرض (). ستقع كل الأعمال المتعلقة بتصيير المكعب على الخطوط الهشة لهذه الوظيفة. الفكرة العامة هي: سوف ترسم ستة وجوه منفصلة للمكعب وتضعهم في مواضعهم الخاصة.
    • لكل وجه ، ستحدد أربع زوايا ، وسيقوم OpenGL بتوصيلها بخطوط وملءها باللون الذي اخترته. سيتم شرح كيفية القيام بذلك أدناه.
  2. 2 أضف وظيفة glClear (). بادئ ذي بدء ، عند العمل بهذه الوظيفة ، نحتاج لون واضح و z-buffer... بدون ذلك ، ستكون الصورة القديمة مرئية أسفل الصورة الجديدة ، وسيتم وضع الكائنات المرسومة بواسطة البرنامج بشكل غير صحيح.

      عرض باطل () // مسح الشاشة و Z Buffer glClear (GL_COLOR_BUFFER_BIT

    • انتبه إلى آخر سطرين. هذه هي الوظائف glFlush () ؛ و glutSwapBuffers () ،، مما يعطي تأثير التخزين المؤقت المزدوج ، والذي تم وصفه أعلاه.

جزء 3 من 3: تفاعل البرنامج

  1. 1 أضف وظيفة specialKeys (). من حيث المبدأ ، كل شيء جاهز تقريبًا ، لكن المكعب مرسوم فقط ولا يتم تدويره. للقيام بذلك ، تحتاج إلى إنشاء وظيفة المفاتيح الخاصة ()، والذي سيسمح لك بتدوير المكعب بالضغط على مفاتيح الأسهم!
    • ومن أجل هذه الوظيفة تم الإعلان عن المتغيرين العالميين rotate_x و rotate_y. عندما تضغط على مفتاحي الأسهم الأيمن والأيسر ، ستزيد قيمة rotate_y أو تنقص بمقدار خمس درجات. ستتغير قيمة rotate_x بنفس الطريقة ، ولكن هذه المرة بالضغط على مفتاحي الأسهم لأعلى ولأسفل.
    • مفاتيح خاصة باطلة (مفتاح int ، int x ، int y) {// السهم الأيمن - زيادة الدوران بمقدار 5 درجات إذا (key == GLUT_KEY_RIGHT) rotate_y + = 5 ؛ // Left Arrow - تقليل الدوران بمقدار 5 درجات وإلا إذا (key == GLUT_KEY_LEFT) rotate_y - = 5 ؛ وإلا إذا (key == GLUT_KEY_UP) rotate_x + = 5 ؛ وإلا إذا (المفتاح == GLUT_KEY_DOWN) rotate_x - = 5 ؛ // طلب تحديث الشاشة glutPostRedisplay () ؛ }

  2. 2 أضف glRotate (). آخر شيء سنفعله هو إضافة خط يسمح لنا بتدوير الكائن. العودة إلى الوظيفة عرض () وقبل وصف الجانب الأمامي يضاف:

      // إعادة تعيين التحويلات glLoadIdentity () ؛ // Rotate when The User Changes the القيم 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.
    • تتطلب جميع التحولات التي نحددها في البرنامج سطورًا متشابهة. بشكل أساسي ، نحن نمثل دوران كائن على طول المحور x كتغيير في قيمة rotate_x ، والدوران على طول المحور y كتغيير في قيمة rotate_y. ومع ذلك ، سيقوم برنامج OpenGL بتجميع كل شيء في مصفوفة تحويل واحدة. في كل مرة تتصل فيها بالعرض ، ستقوم بإنشاء مصفوفة تحويل ، و glLoadIdentity () سيسمح لك بالبدء بمصفوفة جديدة في كل مرة.
    • وظائف التحويل الأخرى التي ربما تكون قد استخدمتها هي glTranslatef () و glScalef (). إنها تشبه glRotatef () ، إلا أنها تتطلب ثلاث معاملات فقط: قيم x و y و z لتغيير حجم الكائن وقياسه.
    • لكي يتم عرض كل شيء بشكل صحيح عند تطبيق جميع التحويلات الثلاثة على كائن واحد ، فأنت بحاجة إلى ضبط التحويلات بالترتيب المناسب ، أي glTranslate ، 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 // الوصف: إنشاء نافذة OpenGL ورسم مكعب ثلاثي الأبعاد / / يمكن للمستخدم التدوير باستخدام مفاتيح الأسهم // // عناصر التحكم: سهم لليسار - تدوير لليسار // سهم لليمين - تدوير لليمين // سهم لأعلى - تدوير لأعلى // سهم لأسفل - تدوير لأسفل // ------ -------------------------------------------------- - // يشمل // ------------------------------------------- - -------------- #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 // --------------------------------------- - ------------------ // النماذج الأولية للوظيفة // ------------------------- - -------------------------------- عرض باطل () ؛ مفاتيح خاصة باطلة () ؛ // ------------------------------------------------ ---------- // المتغيرات العالمية // ---------------------------------- ------------------------ مزدوج rotate_y = 0 ؛ rotate_x مزدوج = 0 ؛ // ------------------------------------------------ ---------- // display () وظيفة رد الاتصال // ------------------------------- --------------------------- عرض باطل () // مسح الشاشة و 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 ؛ وإلا إذا (المفتاح == GLUT_KEY_UP) rotate_x + = 5 ؛ وإلا إذا (المفتاح == GLUT_KEY_DOWN) rotate_x - = 5؛ // طلب تحديث العرض glutPostRedisplay () ؛} // ----------------------------------- - ---------------------- // main () function // ------------------- - -------------------------------------- int main (int argc، char * argv [] ) GLUT_RGB