Начинаем программировать 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