Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

02 {

03 glViewport(0, 0, width, height);

04 glMatrixMode(GL_PROJECTION);

05 glLoadIdentity;

06 GLfloat x = GLfloat(width) / height;

07 glFrustum(-x, x, -1.0, 1.0, 4.0, 15.0);

08 glMatrixMode(GL_MODELVIEW);

09 }

Функция resizeGL вызывается один раз перед первым вызовом функции paintGL, но после вызова функции initializeGL. Oнa также всегда вызывается

при изменении размера виджета. Именно в этом месте мы можем задавать область отображения OpenGL, ее проекцию и делать любые другие настройки, зависящие от размера виджета.

01 void Tetrahedron::paintGL

02 {

03 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

04 draw;

05 }

Функция paintGL вызывается всякий раз, когда необходимо перерисовать виджет. Это напоминает функцию QWidget::paintEvent, но вместо функций класса QPainter здесь мы используем функции библиотеки OpenGL. Реальное рисование выполняется закрытой функцией draw.

01 void Tetrahedron::draw

02 {

04 static const GLfloat P1[3]= { 0.0, -1.0, +2.0 };

05 static const GLfloat P2[3] = { +1.73205081, -1.0, -1.0 };

06 static const GLfloat P3[3] = { -1.73205081, -1.0, -1.0 };

07 static const GLfloat P4[3] = { 0.0, +2.0, 0.0 };

08 static const GLfloat * const coords[4][3] = {

09 { P1, P2, РЗ }, { P1, РЗ, P4 }, { P1, P4, P2 }, { P2, P4, РЗ }

10 };

11 glMatrixMode(GL_MODELVIEW);

12 glLoadIdentity;

13 glTranslatef(0.0, 0.0, -10.0);

14 glRotatef(rotationX, 1.0, 0.0, 0.0);

15 glRotatef(rotationY, 0.0, 1.0, 0.0);

16 glRotatef(rotationZ, 0.0, 0.0, 1.0);

17 for (int i = 0; i < 4; ++i) {

18 glLoadName(i);

19 glBegin(GL_TRIANGLES);

20 qglColor(faceColors[i]);

21 for (int j = 0; j < 3; ++j) {

22 glVertex3f(coords[i][j][0],

23 coords[i][j][1], coords[i][j][2]);

24 }

25 glEnd;

26 }

27 }

В функции draw мы рисуем тетраэдр, учитывая повороты по осям x, у и z, а также цвета в массиве faceColors. Везде вызываются стандартные функции библиотеки OpenGL, за исключением вызова qglColor. Вместо этого мы могли бы использовать одну из функций OpenGL — glColor3d или glIndex — в зависимости от используемого режима.

01 void Tetrahedron::mousePressEvent(QMouseEvent *event)

02 {

03 lastPos = event->pos;

04 }

05 void Tetrahedron::mouseMoveEvent(QMouseEvent *event)

06 {

07 GLfloat dx = GLfloat(event->x - lastPos.x) / width;

08 GLfloat dy = GLfloat(event->y - lastPos.y) / height;

09 if (event->buttons & Qt::LeftButton) {

10 rotationX += 180 * dy;

11 rotationY += 180 * dx;

12 updateGL;

13 } else if (event->buttons & Qt::RightButton) {

14 rotationX += 180 * dy;

15 rotationZ += 180 * dx;

16 updateGL;

17 }

18 lastPos = event->pos;

19 }

Функции

класса QWidget mousePressEvent и mouseMoveEvent переопределяются, чтобы разрешить пользователю поворачивать изображение щелчком мышки и ее перемещением. Левая кнопка мышки позволяет пользователю поворачивать вокруг осей x и у, а правая кнопка мышки — вокруг осей x и z.

После модификации переменных rotationX и rotationY или rotationZ мы вызываем функцию updateGL для перерисовки сцены.

01 void Tetrahedron::mouseDoubleClickEvent(QMouseEvent *event)

02 {

03 int face = faceAtPosition(event->pos);

04 if (face != -1) {

05 QColor color = QColorDialog::getColor(faceColors[face], this);

06 if (color.isValid) {

07 faceColors[face] = color;

08 updateGL;

09 }

10 }

11 }

Функция mouseDoubleClickEvent класса QWidget переопределяется, чтобы разрешить пользователю устанавливать цвет грани тетраэдра с помощью двойного щелчка. Мы вызываем закрытую функцию faceAtPosition для определения той грани, на которой находится курсор (если он вообще находится на какой-нибудь грани). При двойном щелчке по грани тетраэдра мы вызываем функцию QColorDialog::getColor для получения нового цвета для этой грани. Затем мы обновляем массив цветов faceColors новым цветом, и мы вызываем функцию updateGL для перерисовки экрана.

01 int Tetrahedron::faceAtPosition(const QPoint &pos)

02 {

03 const int MaxSize = 512;

04 GLuint buffer[MaxSize];

05 GLint viewport[4];

06 glGetIntegerv(GL_VIEWPORT, viewport);

07 glSelectBuffer(MaxSize, buffer);

08 glRenderMode(GL_SELECT);

09 glInitNames;

10 glPushName(0);

<
Поделиться:
Популярные книги

Кодекс Крови. Книга III

Борзых М.
3. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга III

Последнее небо

Игнатова Наталья Владимировна
1. Зверь
Фантастика:
боевая фантастика
6.81
рейтинг книги
Последнее небо

На границе империй. Том 10. Часть 8

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 8

Четники. Королевская армия

Тимофеев Алексей Юрьевич
Документальная литература:
биографии и мемуары
публицистика
5.00
рейтинг книги
Четники. Королевская армия

Второгодка. Книга 5. Презренный металл

Ромов Дмитрий
5. Второгодка
Фантастика:
городское фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Второгодка. Книга 5. Презренный металл

Чужая семья генерала драконов

Лунёва Мария
6. Генералы драконов
Фантастика:
фэнтези
5.00
рейтинг книги
Чужая семья генерала драконов

Товарищ "Чума" 2

lanpirot
2. Товарищ "Чума"
Фантастика:
городское фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Товарищ Чума 2

Рассвет русского царства. Книга 2

Грехов Тимофей
2. Новая Русь
Фантастика:
альтернативная история
попаданцы
историческое фэнтези
5.00
рейтинг книги
Рассвет русского царства. Книга 2

Древесный маг Орловского княжества 6

Павлов Игорь Васильевич
6. Орловское княжество
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 6

Я – Стрела. Трилогия

Суббота Светлана
Я - Стрела
Любовные романы:
любовно-фантастические романы
эро литература
6.82
рейтинг книги
Я – Стрела. Трилогия

Неучтенный элемент. Том 1

NikL
1. Антимаг. Вне системы
Фантастика:
городское фэнтези
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 1

Второй кощей

Билик Дмитрий Александрович
8. Бедовый
Фантастика:
юмористическое фэнтези
городское фэнтези
мистика
5.00
рейтинг книги
Второй кощей

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

Инженер Петра Великого 4

Гросов Виктор
4. Инженер Петра Великого
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Инженер Петра Великого 4