Регистрация - Вход

Реклама на сайте


Начинаем программировать OpenGL в Python


Я хочу Вам рассказать о графической библиотеке OpenGL и её использовании в Python. Эта статья не обучит Вас программированию OpenGL, но после её прочтения Вы получите общее представление об этой библиотеке и её использовании в Питоне.

OpenGL (Open Graphics Library) - это мощная графическая библиотека, разработанная Silicon Graphics, предназначенная для быстрой работы с 2D и 3D графикой. Она часто используется при написании как 3D-игр, так и серьёзных научных приложений.

Разрабатывать программы под OpenGL можно на разных языках программирования, в том числе и на Python. Правда для этого следует установить питоновскую библиотеку PyOpenGL. Найти её можно на сайте pyopengl.sf.net Тамже вы найдёте обширную документацию и ссылки на эту тему.

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

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

Начнем с импорта необходимых библиотек. В OpenGL входит основная библиотека "opengl" и библиотека утилит "glu", а также для создания окна и обработки различных событий используется библиотека "glut". Кроме них нам ещё понадобится стандартный модуль sys.

from OpenGL.GL import *

from OpenGL.GLU import *

from OpenGL.GLUT import *

import sys

Теперь обнулим значение глобальной переменной rot, она будет отвечать за вращение куба.

 rot = 0

Пришло время поработать с OpenGL. В начале работы программы всегда нужно настроить эту библиотеку должным образом, за это будет отвечать функция InitGL. Её параметры - ширина и высота окна.

def InitGL(Width, Height):

    glClearColor(0.0, 0.0, 0.0, 0.0)

    glClearDepth(1.0)

    glDepthFunc(GL_LESS)

    glEnable(GL_DEPTH_TEST)

    glEnable(GL_LIGHTING)

    glEnable(GL_LIGHT0)

    glEnable(GL_COLOR_MATERIAL)

    glMatrixMode(GL_PROJECTION)

    glLoadIdentity()

    gluPerspective(45.0, float(Width)/float(Height), 0.1, 1000.0)

    glMatrixMode(GL_MODELVIEW)

Вкратце опишу значения всех команд этой функции. В первой строке изменяется цвет фона в окне OpenGL. Он задаётся в виде значений компонентов цвета RGBA (красный, зелёный, синий, альфа). Эти значения должны лежать в пределах от 0 до 1. В данном случае задан чёрный цвет. Следующие три команды задают работу с буффером глубины, который отвечает за то, чтобы более близкие объекты рисовались впереди дальних. Затем командами glEnable(включить) включается освещение, и нулевой источник света (всего их может быть 8). Вызов glEnable(GL_COLOR_MATERIAL) задёт управление материалом (цвет и отражающие способности) предметов при помощи функции glColor. Следующие четыре строки задают параметры изображения объектов в зависимости от размеров окна.

Вторая функция, которую мы напишем - ReSizeGLScene. Она будет вызываться при изменении размеров окна.

def ReSizeGLScene(Width, Height):

    if Height == 0: Height = 1

    glViewport(0, 0, Width, Height)

    glMatrixMode(GL_PROJECTION)

    glLoadIdentity()

    gluPerspective(45.0, float(Width)/float(Height), 0.1, 100.0)

    glMatrixMode(GL_MODELVIEW)

Эта функция очень похожа на конец InitGL. Так как размеры окна изменились, то следует изменить параметры изображения объектов.

Третья функция будет рисовать на экране вращающийся куб.

def DrawGLScene():

    global rot

    rot  = (rot + 1) % 360 # увеличиваем угол поворота

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # очищаем экран

    glLoadIdentity()  # восстанавливаем мировые координаты

    glTranslatef(0.0,0.0,-10.0)

    glRotatef(rot,1.0,0.0,0.0)

    glRotatef(rot,0.0,1.0,0.0)

    glRotatef(rot,0.0,0.0,1.0)

    glColor4f(0.0,0.7,0.1,1)

    glutSolidCube(3)

    glutSwapBuffers()

В начале мы увеличиваем угол поворота куба, потом очищаем экран командой glClear и восстанавливаем мировые координаты, чтобы мир не "уплыл" неведомо куда :) Команда glTranslatef перемещет систему координат в определённую точку, заданную параметрами X,Y,Z. В данном случае мы перемещаем систему на 10 пунктов вдоль оси Z в отрицательном направлении. Каждая из команд glRotatef вращает куб вокруг вектора, заданного последними тремя параметрами. Вначале вокруг оси X, затем вокруг Y и Z. Командой glColorf задаём цвет куба, опять-же параметрами RGBA. glutSolidCube(3) рисует куб с длиной стороны равной 3. Последняя команда glutSwapBuffers() выводит всё на экран.

Теперь обработаем нажатие кнопки escape:

def KeyPressed(*args):

    if args[0]=="\033": sys.exit()

Осталась только основная программа, она выглядит так:

def main():

    glutInit(sys.argv)

    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH)

    glutInitWindowSize(400, 300)

    glutInitWindowPosition(0, 0)

    glutCreateWindow("OpenGL demo")

    glutDisplayFunc(DrawGLScene)

    glutIdleFunc(DrawGLScene)

    glutReshapeFunc(ReSizeGLScene)

    glutKeyboardFunc(KeyPressed)

    InitGL(400, 300)

    glutMainLoop()

main()

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

Вот и всё, простейшая программа написана. Текст приведённого примера в виде Python - файла : openglstart.py.

При просмотре других OpenGL-программ Вы заметите, насколько их код похож на рассмотренный здесь. Действительно, чаще всего изменяется только код функции DrawGLScene и немного InitGL, всё остальное остаётся неизменным. Теперь Вам следует обратиться к более подробным источникам, и после некоторого обучения Вы сможете наполнить этот простой пример своим кодом и создать какую-нибудь мощную и красивую программу. При установке PyOpenGL вместе c этой библитекой устанавливаются несколько отличных примеров программ от NeHe. А на сайте nehe.gamedev.org Вы сможете найти множество интересных обучающих программ и демонстрационных приложений. Главным сайтом по OpenGL является www.opengl.org, здесь Вы найдете интересные статьи, новости и ссылки на другие материалы. Я надеюсь, что смог Вас заинтересовать, и что Вы получили общее представление о графической библиотеке OpenGL и её использовании в Питоне.

Обучение программированию под OpenGL - дело нелёгкое и небыстрое. Этому не научишься за один час или за один день. Опыт накапливается вместе с числом написанных программ. Так что старайтесь при обучении побольше экспериментировать и создавать что-нибудь своими руками - и у Вас всё получится.

Источники:

purepython.narod.ru


КОММЕНТАРИИ







Теги


RSS

Архив