Модули

Введение в OpenGL и PyOpenGL. Часть II: раскрашивание поверхностей вращающегося куба

Предыдущая статья — Введение в OpenGL и PyOpenGL. Часть I: создание вращающегося куба.

В этой статье мы обсудим, как можно раскрашивать предметы, в частности поверхности. Для этого мы сначала должны уведомить OpenGL о том, что мы собираемся сделать. После этого мы должны сообщить OpenGL, где находится поверхность, которую мы собираемся закрасить. Ничего сложного, зато еще одна функция OpenGL будет освоена!

Итак, сначала нам нужно выбрать несколько цветов. OpenGL хочет, чтобы вы указывали цвета в формате RGB, но также он ожидает, что значения цветов будут между 0 и 1, где 1 означает самый сильный оттенок цвета.

Например, красивый сплошной зеленый цвет будет выглядеть так: (0,1,0). 0 — это красный, 1 — это зеленый, а 0 — синий. То есть, красный и синий отсутствуют, а зеленый представлен в полной мере.

Теперь давайте продолжим и определим кортеж, состоящий из кортежей цветов:

colors = (
    (1,0,0),
    (0,1,0),
    (0,0,1),
    (0,1,0),
    (1,1,1),
    (0,1,1),
    (1,0,0),
    (0,1,0),
    (0,0,1),
    (1,0,0),
    (1,1,1),
    (0,1,1),
    )

Мы пока не будем использовать все это, и, вероятно, позже изменим эти цвета.

Затем нам нужно добавить новый код раскраски в нашу функцию Cube().

На данный момент функция Cube() имеет следующий вид:

def Cube():
    glBegin(GL_LINES)
    for edge in edges:
        for vertex in edge:
            glVertex3fv(verticies[vertex])
    glEnd()

Далее нам нужно определить поверхности. Они определяются в виде групп вершин.

surfaces = (
    (0,1,2,3),
    (3,2,7,6),
    (6,7,5,4),
    (4,5,1,0),
    (1,5,7,2),
    (4,0,3,6)
    )

Теперь мы хотим добавить к нашей функции Cube() следующий код:

    glBegin(GL_QUADS)
    for surface in surfaces:
        x = 0
        for vertex in surface:
            x+=1
            glColor3fv(colors[x])
            glVertex3fv(verticies[vertex])
    glEnd()

Итак, здесь вы видите обычный glBegin, только на этот раз у нас GL_QUADS в качестве константы. Затем для каждой поверхности (набора вершин) в кортеже поверхностей и для каждой вершины в этом списке из четырех вершин мы будем использовать функцию glColor3fv, которая будет окрашивать создаваемый нами объект. А потом мы, как и ранее, используем функцию glVertex3fv!

Единственно, что здесь еще есть, — это обычный счетчик, добавляющий 1 к значению переменной x, что позволяет нам немного менять цвета куба.

Теперь наша функция Cube() выглядит следующим образом:

def Cube():
    glBegin(GL_QUADS)
    for surface in surfaces:
        x = 0
        for vertex in surface:
            x+=1
            glColor3fv(colors[x])
            glVertex3fv(verticies[vertex])
    glEnd()

    glBegin(GL_LINES)
    for edge in edges:
        for vertex in edge:
            glVertex3fv(verticies[vertex])
    glEnd() 

Отлично, теперь мы имеем:

Ilyaragalin

Recent Posts

10 удалённых Python-вакансий

Если вы ищете работу на Python, на Talanto.work сейчас есть варианты для junior, middle, senior…

6 месяцев ago

Где искать Python-вакансии в 2026 году: зачем на Talanto.work появился отдельный сценарий поиска

Рынок Python-вакансий большой, но удобным его назвать сложно. Формально вакансий много, однако в реальном поиске…

6 месяцев ago

Срезы в Python со всеми подробностями

Срезы в Python — это больше, чем a[2:7]. В статье — быстрый разбор полезных приёмов:…

8 месяцев ago

Возведение в степень в Python: полное руководство

В этой статье мы рассмотрим возведение в степень в Python с помощью различных методов, от…

9 месяцев ago

Как удалить дубликаты из списка Python?

Дубликаты в списке Python — частая проблема. В статье показано, как быстро убрать повторы, в…

9 месяцев ago

Виртуальный (shared) хостинг от SpaceWeb: технический обзор

Услуга виртуального хостинга на SpaceWeb позволяет арендовать часть сервера (shared-сервера) и разместить на нём свой…

11 месяцев ago