Уроки, алгоритмы, программы, примеры

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

У меня проблема вот с этим: gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);. Вылезает ошибка: CS1061 "object" не содержит определения "GL_COLOR_BUFFER_BIT", и не удалось найти доступный метод расширения "GL_COLOR_BUFFER_BIT",...
Большое спасибо. Единственный код который прошел без каких либо ошибок. Ура!!!
Скажите пожалуйста, подскажите алгоритм по которому по заданным точкам можно определить тип многогранника, скажем это куб или прямоугольный параллелепипед. Нашел теорию по этим фигурам: https://www.mat... https://www.mat... Акцентировать внимание...
Всем у кого не работает. файл wizard.script Ещё одно упоминание Glut32 в строке "if (!VerifyLibFile(dir_nomacro_lib, _T("glut32"), _T("GLUT's"))) return false;" меняем на "if (!VerifyLibFile(dir_nomacro_lib, _T("freeglut"), _T("GLUT's"))) return...
Не получается, емаё

Счетчики и рейтинг

Рейтинг@Mail.ru Яндекс.Метрика
Среда программирования: 
Python

В данной программе будет представлен пример, как работать с объёмными фигурами в
OpenGL на языке Python. В итоге будет представлен куб в 3-ёх мерном виде с разноцветными гранями.

Среда разработки: PyCharm Community Edition 2020.1.2

Перед тем, как приступить к данному уроку, следует ознакомиться с предыдущим уроком: Работа с 3-х мерными объектами в Python с использованием OpenGL

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

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

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

Теперь давайте продолжим и определим кортеж, состоящий из кортежей цветов в функции main():

colors = (
        (1, 0, 0),
        (0, 1, 0),
        (0, 0, 1),
        (1, 0, 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),
    )

Далее нам нужно определить поверхности. Они определяются в виде групп вершин:
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().

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

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

Теперь мы добавим к нашей функции 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(vertices, edges, surfaces, colors):
    glBegin(GL_QUADS)
    for surface in surfaces:
        x = 0
        for vertex in surface:
            x += 1
            glColor3fv(colors[x])
            glVertex3fv(vertices[vertex])
    glEnd()
 
    glBegin(GL_LINES)
    for edge in edges:
        for vertex in edge:
            glVertex3fv(vertices[vertex])
    glEnd()

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

Код программы:

import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
 
def Cube(vertices, edges, surfaces, colors):
    glBegin(GL_QUADS)
    for surface in surfaces:
        x = 0
        for vertex in surface:
            x += 1
            glColor3fv(colors[x])
            glVertex3fv(vertices[vertex])
    glEnd()
 
    glBegin(GL_LINES)
    for edge in edges:
        for vertex in edge:
            glVertex3fv(vertices[vertex])
    glEnd()
 
def main():
    vertices = (
        (1.0, -1.0, -1.0),
        (1.0, 1.0, -1.0),
        (-1.0, 1.0, -1.0),
        (-1.0, -1.0, -1.0),
        (1.0, - 1.0, 1.0),
        (1.0, 1.0, 1.0),
        (-1.0, -1.0, 1.0),
        (-1.0, 1.0, 1.0)
    )
 
    edges = (
        (0, 1),
        (0, 3),
        (0, 4),
        (2, 1),
        (2, 3),
        (2, 7),
        (6, 3),
        (6, 4),
        (6, 7),
        (5, 1),
        (5, 4),
        (5, 7)
    )
 
    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)
    )
 
    colors = (
        (1, 0, 0),
        (0, 1, 0),
        (0, 0, 1),
        (1, 0, 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),
    )
 
    pygame.init()
    display = (800, 600)
    pygame.display.set_mode(display, DOUBLEBUF|OPENGL)
    glClearColor(0.1, 0.5, 1.0, 0)
 
    gluPerspective(45, (display[0]/display[1]), 0.1, 50.0)
 
    glTranslatef(0.0, -1.0, -10)
    glRotatef(20, 10, 0, 0)
 
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
        glRotatef(1, 0, 1, 0)
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
        Cube(vertices, edges, surfaces, colors)
        pygame.display.flip()
        pygame.time.wait(10)
 
main()

Больше функций и описание их работы на сайте: docs.gl

Прикрепленный файлРазмер
main.rar713 байтов