Подключение OpenGL в QT
Рассмотрим пример подключения графической библиотеки OpenGL к QT проекту. Постараюсь выложить как можно доступнее, только самое необходимое для быстрого начала. Здесь мы рассмотрим только пример подключения и вывод простейшей сцены. В следующих заметках добавим поворот камеры и т. д.
И так... Поехали.
Наиболее удобный вариант подключения - использовать "штатные" средства QT. Разумеется, есть и другие варианты - Glut (FreeGlut), Glaux (только для Windows), glu и т.д. - но, во первых, они не из самых простых, а во вторых - они не для ООП (объектно-ориентированного программирования (можно пытаться извращаться, но до добра редко приводит - например, в качестве callback’а метод вряд ли получится использовать) ).
Для подключения OpenGL к проекту, сначала надо прописать у *pro файл следующее:
QT += opengl
Теперь создадим класс, который будет выводить 3D изображение. Он должен быть наследником QGLWidget:
#include <QGLWidget>
#include <GL/gl.h>
class WOpengl: public QGLWidget { public: WOpengl(); };
Теперь переопределим методы
void initializeGL();
void resizeGL(int nWidth, int nHeight);
void paintGL();
Первый метод вызывается при инициализации окна, второй - при изменении размеров окна, третий - "рабочий" - в нем сама процедура отрисовки.
Примеры переопределенных методов:
voidWOpengl::initializeGL()
{
//Задаем цвет фона в OpenGL окне qglClearColor(Qt::black);
//Задаем режим обработки полигонов - переднюю и заднюю часть, //полигоны полностью закрашенные //(а можно просто рамку отображать) glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); }
void WOpengl::resizeGL(int nWidth, int nHeight) {
//Устанавливаем точку обзора. Последние два параметры одинаковы - // чтобы не нарушать пропорции у широких экранов //(можете поэкспериментировать) glViewport(0, 0, nHeight, nHeight);
//Устанавливаем режим матрицы glMatrixMode(GL_PROJECTION);
//Загружаем матрицу glLoadIdentity(); }
void WOpengl::paintGL() { //Очищаем экран glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//Задаем режим матрицы glMatrixMode(GL_PROJECTION);
//Загружаем матрицу glLoadIdentity();
//Здесь рисуем - для удобства в отдельной функции scene();
//выводим на экран swapBuffers(); }
Теперь осталось описать функцию, которая что-то рисует. Например,
void WOpengl::scene()
{
//Задаем цвет изображения
qglColor(Qt::green);
//Начинаем отрисовку, аргумент означает отрисовку прямоугольника. //Каждый вызов glVertex3f задает одну вершину прямоугольника glBegin(GL_QUADS); glVertex3f(0.51, 0.51, 0.51); glVertex3f(-0.51, 0.51, 0.51); glVertex3f(-0.51, -0.51, 0.51); glVertex3f(0.51, -0.51, 0.51); glEnd(); }
И так... Пока что все. В результате имеем 3D окошко с отрисованым прямоугольником.
В следующей заметке научимся вращать сцену.
Исходники готового проекта можно взять здесь: simple_3D