لماذا openGL مع Qt
ان ماتوفره Qt لك من إمكانيات في التعامل مع openGL يجعلها خيارك الأول في برمجة الجرافيكس ثلاثي الأبعاد حيث ان Qt لاتوفر لك نافذة ترسم عليها بإستخدام openGL فقط بل يعتبر الأخير عنصر رسوم في QGraphicsViewيندمج مع العناصر الرسومية الأخرى في مشهد واحد سواء كانت نوافذ او رسومات او كل ماهو مرئي فجميعهم QgraphicsItem.
وبما اننا سوف نتكلم عن أول برنامج فإنن سوف نرسمها على نافذة خاصة لرسم عناصر openGL تدعى GLWidget ضمن الفئة QGLWidget .
وفي حال انك رسم على نافذة مسبقا سوف تعرف ان هناك أحداث خاصة بالرسم على النوافذ (دوال محمية)
تدعى paintEvent() ويتم استدعائها بشكل تلقائي في كل مرة تحرك النافذة او تغير حجمها او حتى تظهر نوافذ أخرى فوقها او بإستخدام الدالة repaint() ولعل أخينا عمر العادل سوف يتحدث عن هذا الموضوع في سلسلة دروسه للرسم ثنائي الأبعاد في Qt .
ولكن الآن نحن سوف نرسم على نافذة GL فلذلك فإن الحدث يصبح اسمه paintGL() ويتم استدعاءه لذات الشروط السابقة في الرسم على النوافذ أنر المثال :-
#include <QGLWidget>
class GLWidget : public QGLWidget
{
Q_OBJECT
public:
GLWidget(QWidget *parent = 0);
protected:
void paintGL(); //paintEvent on all windows
void resizeGL(int width, int height);//event called if you resize the window
};
سوف نقوم بإعادة تعرف كل من الدالتين (الحدثين) paintGL() و resizeGL()
include <QtGui>
#include <QtOpenGL>
#include <math.h>
#include "glwidget.h"
GLWidget::GLWidget(QWidget *parent):QGLWidget(parent){}
void GLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslated(0.0, 0.0, -10.0);
glBegin(GL_POLYGON);
glColor3d(100,0,0);
glVertex2d(1,1);
glVertex2d(1,-1);
glVertex2d(-1,-1);
glVertex2d(-1,1);
glEnd();
glFlush();
}
void GLWidget::resizeGL(int width, int height)
{
int side = qMin(width, height);
glViewport((width - side) , (height - side), side, side);
glClearColor(0,234,0,255);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-3.0, +3.0, +3.0, -3.0, 0.0, 30.0);
glMatrixMode(GL_MODELVIEW);
}
لاحظ ان جميع الدوال التي في الدالتين paintGL و resizeGL هي دوال تابعة لمكتبة openGL ففي resizeGL قمنا بتهيئة ابعاد النافذة التي سوف نرسم عليها (نام الإحداثيات العام) وسوف يتغير تبعا لتغير حجم النافذة لذلك وضعناه في هذه الدالة بينما في الدالة paintGL قمنا برسم المربع فبذلك نكو قد صنعنا اول برنامج لنا في QtOpenGL.
وأخيرا وفي الدالة main قمنا بإظهار النافذة
#include "glwidget.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
GLWidget glw;
glw.show();
return app.exec();
}
والسلام عليكم .