#include <GL/glut.h>
#include <math.h>
const float PI = 22.0f / 7.0f;
void SetupRC() {
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, 1.0, 1.0, 5000.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(-300.0,-300.0, 600.0,
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
}
void Draw() {
glBegin(GL_QUADS);
glColor3f(1, 0, 0);
glVertex3f(100, 100, 100); // 1
glVertex3f(-100, 100, 100); // 2
glVertex3f(-100, -100, 100); // 3
glVertex3f(100,-100, 100);// 4
glEnd();
glBegin(GL_QUADS);
glColor3f(1, 1, 0);
glVertex3f(100, 100, -100); // 5
glVertex3f(-100, 100, -100); // 6
glVertex3f(-100, -100, -100); // 7
glVertex3f(100, -100, -100);// 8
glEnd();
glBegin(GL_QUADS);
glColor3f(0, 1, 0);
glVertex3f(100, 100, -100); // 5
glVertex3f(100, 100, 100); // 1
glVertex3f(100, -100, 100);// 4
glVertex3f(100, -100, -100);// 8
glEnd();
glBegin(GL_QUADS);
glColor3f(0, 1, 0);
glVertex3f(-100, 100, -100); // 5
glVertex3f(-100, 100, 100); // 1
glVertex3f(-100, -100, 100);// 4
glVertex3f(-100, -100, -100);// 8
glEnd();
glBegin(GL_QUADS);
glColor3f(0, 0, 1);
glVertex3f(100, -100, 100);// 4
glVertex3f(-100, -100, 100); // 3
glVertex3f(-100, -100, -100); // 7
glVertex3f(100, -100, -100);// 8
glEnd();
glBegin(GL_QUADS);
glColor3f(0, 0, 1);
glVertex3f(100, 100, 100);
glVertex3f(-100, 100, 100);
glVertex3f(-100, 100, -100);
glVertex3f(100, 100, -100);
glEnd();
}
void RenderScene() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST); // Enable depth testing
Draw(); //
glFlush();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); // Enable depth buffer
glutInitWindowSize(500, 500);
glutCreateWindow("OpenGL Half Cylinder");
SetupRC();
glutDisplayFunc(RenderScene);
glutMainLoop();
return 0;
}
هذا الكود هو برنامج بلغة C++ يستخدم مكتبة OpenGL (GLUT) لرسم مكعب ثلاثي الأبعاد (3D Cube) ملون، مع إعداد كاميرا بمنظور واقعي (Perspective) وتفعيل خاصية عمق الرؤية (Depth Test).
إليك شرح تفصيلي لكل جزء من الكود:
1. المكتبات والثوابت
#include <GL/glut.h>
#include <math.h>
const float PI = 22.0f / 7.0f;
- يتم استدعاء مكتبة
glut.hللرسومات، ومكتبةmath.hللعمليات الحسابية (رغم عدم استخدام دوال رياضية معقدة في هذا الكود تحديداً).
2. دالة الإعداد SetupRC
هذه الدالة تجهز "بيئة الرسم" قبل البدء.
void SetupRC() {
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // خلفية بيضاء
glMatrixMode(GL_PROJECTION); // التبديل لمصفوفة الإسقاط لضبط العدسة
glLoadIdentity();
gluPerspective(45.0, 1.0, 1.0, 5000.0); // تحديد منظور الرؤية
glMatrixMode(GL_MODELVIEW); // التبديل لمصفوفة النموذج لضبط الكاميرا
glLoadIdentity();
gluLookAt(-300.0,-300.0, 600.0, // موقع الكاميرا (عين المشاهد)
0.0, 0.0, 0.0, // النقطة التي تنظر إليها الكاميرا (المركز)
0.0, 1.0, 0.0); // اتجاه الرأس (لأعلى)
}
gluPerspective: تحدد أن الرسم ثلاثي الأبعاد (الأشياء البعيدة تبدو أصغر). زاوية الرؤية 45 درجة.gluLookAt: تضع الكاميرا في موقع معين(-300, -300, 600)وتوجهها لتنظر إلى نقطة الأصل(0,0,0). هذا يجعلنا نرى المكعب من زاوية مائلة.
3. دالة الرسم Draw
هذه الدالة تقوم برسم أوجه المكعب الستة باستخدام GL_QUADS (كل 4 نقاط تشكل وجهاً مربعاً).
- المكعب مرسوم حول نقطة الأصل (0,0,0) بأبعاد تمتد من -100 إلى 100 في المحاور الثلاثة (طول الضلع 200).
- الأوجه والألوان:
- الأحمر (Red): الوجه الأمامي (Z = 100).
- الأصفر (Yellow): الوجه الخلفي (Z = -100).
- الأخضر (Green): الوجه الأيمن والوجه الأيسر.
- الأزرق (Blue): الوجه السفلي والوجه العلوي.
4. دالة العرض RenderScene
void RenderScene() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // مسح الشاشة ومخزن العمق
glEnable(GL_DEPTH_TEST); // تفعيل اختبار العمق
Draw(); // استدعاء دالة رسم المكعب
glFlush(); // تنفيذ الأوامر فوراً
}
GL_DEPTH_BUFFER_BITوglEnable(GL_DEPTH_TEST): هذا هو الجزء الأهم في الرسم ثلاثي الأبعاد. بدونه، ستقوم OpenGL برسم الأوجه بترتيب الكود، مما قد يجعل وجهاً خلفياً يظهر فوق وجه أمامي بشكل خاطئ. اختبار العمق يضمن أن الأجسام القريبة تحجب الأجسام البعيدة.
5. دالة main
int main(int argc, char** argv) {
glutInit(&argc, argv);
// تفعيل التخزين المؤقت للعمق (GLUT_DEPTH) ضروري جداً للـ 3D
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutCreateWindow("OpenGL Half Cylinder"); // عنوان النافذة
SetupRC(); // استدعاء الإعدادات
glutDisplayFunc(RenderScene); // ربط دالة العرض
glutMainLoop(); // بدء الحلقة اللانهائية
return 0;
}
- تمت إضافة
GLUT_DEPTHفيglutInitDisplayModeلحجز ذاكرة لحسابات العمق (Z-buffer).
الخلاصة
عند تشغيل البرنامج، ستظهر نافذة خلفيتها بيضاء، تحتوي على مكعب ملون تراه من زاوية مائلة، وتظهر الألوان (الأحمر، الأخضر، الأزرق) بناءً على اتجاه الأوجه بالنسبة للكاميرا.