لقد علمك القسم السابق كيفية تلوين المثلثات والأشكال الرباعية. سيعلمك هذا الدرس كيفية تدوير هذه الكائنات الملونة حول محاورها الإحداثية.
في الواقع، ما عليك سوى إضافة بضعة أسطر إلى الكود الموجود في القسم السابق. دعونا نعيد كتابة الروتين بأكمله مرة أخرى. من السهل عليك معرفة ما تمت إضافته وما تم تعديله.
أضف متغيرين للتحكم في دوران هذين الكائنين. تتم إضافة هذين المتغيرين بعد المتغيرات الأخرى في بداية البرنامج (منطقي ملء الشاشة = TRUE؛ سطرين أدناه). إنها متغيرات من النوع العائم تسمح لنا بتدوير الكائنات بدقة شديدة. تحتوي أرقام الفاصلة العائمة على منازل عشرية، مما يعني أننا لا نحتاج إلى استخدام زوايا 1، 2، 3... ستجد أن أرقام الفاصلة العائمة هي أساس برمجة OpenGL. يتم استخدام المتغير الجديد المسمى rtri لتدوير المثلث، ويستخدم rquad لتدوير الشكل الرباعي.
فار
…
rtri : GLfloat؛ // زاوية المثلث (جديد)
rquad : GLfloat؛ // الزاوية الرباعية (جديدة)
…
ثم قم بتعديل glDraw() كما يلي:
PROcedure glDraw();
يبدأ
glClear(GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT); // مسح الشاشة والمخزن المؤقت للعمق
glLoadIdentity(); // إعادة تعيين مصفوفة مراقبة النموذج الحالي
// السطر التالي من التعليمات البرمجية جديد. glRotatef(Angle,Xvector,Yvector,Zvector) مسؤول عن تدوير الكائن حول محور معين.
// هذا الأمر له العديد من الاستخدامات. الزاوية عادة ما تكون متغيرة تمثل الزاوية التي يتم من خلالها تدوير الكائن.
// تحدد المعلمات الثلاث Xvector وYvector وZvector بشكل مشترك اتجاه محور الدوران.
// على سبيل المثال، يمر المتجه الموصوف بـ (1,0,0) عبر وحدة واحدة من محور الإحداثيات X ويتم توجيهه إلى اليمين.
// يمر المتجه الموصوف بـ (-1,0,0) عبر وحدة واحدة من محور الإحداثيات X، ولكن في الاتجاه الأيسر.
// د. مايكل تروب: يقدم الشرح أعلاه لـ Xvector وYvector وZvector.
// لفهم دوران X وY وZ بشكل أفضل، اسمحوا لي أن أقدم بعض الأمثلة...
// المحور X - أنت تستخدم منشار طاولة. يتم وضع المحور الموجود في منتصف النصل من اليسار إلى اليمين (تمامًا مثل المحور السيني في برنامج OpenGL).
// تدور أسنان المنشار الحادة بشكل عشوائي حول المحور السيني، ويبدو أنها تتجه لأعلى أو لأسفل.
// يعتمد على الاتجاه الذي تبدأ فيه شفرة المنشار بالدوران. هذا هو نفس الموقف عندما نقوم بتدوير شيء ما حول المحور X في OpenGL.
//(ملاحظة المترجم: إذا وضعت وجهك نحو الشاشة في هذه اللحظة، فسوف يتم نشرك بالتأكيد ^-^.)
// المحور Y - لنفترض أنك في مركز إعصار ضخم، حيث يشير مركز الإعصار من الأرض إلى السماء (تمامًا مثل المحور Y في OpenGL).
// تدور القمامة والحطام بشكل عشوائي حول المحور Y من اليسار إلى اليمين أو من اليمين إلى اليسار.
// هذا هو نفس الموقف عندما نقوم بتدوير شيء ما حول المحور Y في OpenGL.
// المحور Z - أنت تنظر إلى المروحة من الأمام مباشرة. يتم توجيه مركز المروحة نحوك مباشرةً (مثل المحور Z في برنامج OpenGL).
// تدور شفرات المروحة بشكل عشوائي في اتجاه عقارب الساعة أو عكس اتجاه عقارب الساعة حول المحور Z. هذا هو نفس الموقف الذي يحدث عندما نقوم بتدوير شيء ما حول المحور Z في برنامج OpenGL.
glTranslatef(-1.5, 0.0, -6.0); // انقل إلى اليسار بمقدار 1.5 وحدة وإلى الشاشة 6.0
// في السطر التالي من الكود، إذا كانت rtri تساوي 7، فإننا ندير المثلث بمقدار 7 من اليسار إلى اليمين حول المحور Y.
// يمكنك أيضًا تغيير قيمة المعلمة لتدوير المثلث حول المحورين X وY في وقت واحد.
glRotatef(rtri, 0.0, 1.0, 0.0); // تدوير المثلث حول المحور Y (جديد)
// لا توجد تغييرات على الكود أدناه. يتم رسم مثلث متدرج ملون على الجانب الأيسر من الشاشة ويتم تدويره من اليسار إلى اليمين حول المحور Y.
glBegin(GL_TRIANGLES); // ارسم المثلثات
glColor3f(1.0, 0.0, 0.0); // اضبط اللون الحالي على اللون الأحمر
glVertex3f(0.0, 1.0, 0.0); // قمة الرأس
glColor3f(0.0, 1.0, 0.0); // اضبط اللون الحالي على اللون الأخضر
glVertex3f(-1.0, -1.0, 0.0); // أسفل اليسار
glColor3f(0.0, 0.0, 1.0); // اضبط اللون الحالي على اللون الأزرق
glVertex3f(1.0, -1.0, 0.0); // أسفل اليمين
glEnd(); // نهاية رسم المثلث
// ستلاحظ في الكود أدناه أننا أضفنا استدعاء glLoadIdentity() آخر.
// الغرض هو إعادة تعيين مصفوفة مراقبة النموذج.
// إذا لم نقم بإعادة التعيين واستدعاء glTranslate مباشرة، فستحدث نتائج غير متوقعة.
// نظرًا لتدوير محور الإحداثيات، فمن المحتمل ألا يكون في الاتجاه الذي تريده.
// لذا فإن ما أردناه في الأصل هو تحريك الكائن إلى اليسار واليمين قد يصبح لأعلى ولأسفل، اعتمادًا على مقدار تدوير محور الإحداثيات.
// حاول التعليق على glLoadIdentity() وشاهد النتائج التي ستظهر.
// بعد إعادة تعيين مصفوفة مراقبة النموذج، تتم إعادة ضبط جميع المحاور X وY وZ، ونسميها glTranslate.
// ستلاحظ أننا هذه المرة قمنا بتحريك 1.5 وحدة فقط إلى اليمين بدلاً من 3.0 وحدات مثل الدرس السابق.
// لأنه عندما نقوم بإعادة ضبط المشهد، يعود التركيز إلى مركز المشهد (عند 0.0).
// بهذه الطريقة ما عليك سوى التحرك بمقدار 1.5 وحدة إلى اليمين.
// عندما ننتقل إلى الموضع الجديد، قم بتدوير الرباعية حول المحور X. سوف يدور المربع لأعلى ولأسفل.
glLoadIdentity(); // إعادة تعيين مصفوفة مراقبة النموذج
glTranslatef(1.5, 0.0, -6.0); // تحرك لليمين بمقدار 1.5 وحدة وانتقل إلى الشاشة 6.0
glRotatef(rquad, 1.0, 0.0, 0.0); // تدوير الشكل الرباعي حول المحور X (جديد)
glBegin(GL_QUADS); // ارسم مربعًا
glColor3f(0.6, 0.2, 2.0); // اضبط اللون الحالي على اللون الأرجواني
glVertex3f(-1.0, 1.0, 0.0); // أعلى اليسار
glVertex3f(1.0, 1.0, 0.0); // الجزء العلوي الأيمن
glVertex3f(1.0, -1.0, 0.0); // أسفل اليسار
glVertex3f(-1.0, -1.0, 0.0); // أسفل اليمين
glEnd(); // نهاية الرسم المربع
// السطرين التاليين جديدان.
// إذا تم تخيل rtri وrquad كحاويات،
// ثم في بداية البرنامج قمنا بإنشاء حاويات (rtri، وrquad).
// عندما يتم إنشاء الحاوية، فهي فارغة.
// يضيف السطر الأول من التعليمات البرمجية أدناه 0.2 إلى الحاوية.
// لذلك في كل مرة نقوم فيها بتشغيل الكود السابق، ستتم زيادة القيمة الموجودة في حاوية rtri بمقدار 0.2 هنا.
// يقلل السطر التالي القيمة الموجودة في حاوية rquad بمقدار 0.15.
// وبالمثل، في كل مرة نقوم فيها بتشغيل الكود السابق، ستنخفض القيمة الموجودة في حاوية rquad بمقدار 0.15 هنا.
// سيؤدي السقوط في النهاية إلى دوران الكائن في الاتجاه المعاكس لاتجاه النمو.
rtri := rtri + 0.2; // زيادة متغير دوران المثلث (جديد)
rquad := rquad - 0.15; // تقليل متغير دوران الشكل الرباعي (جديد)
نهاية؛