|
purepython.narod.ru
Python
by Gregory Dryapak
| |
|
Начинаем программировать OpenGL в Python
Я хочу Вам рассказать о графической библиотеке OpenGL и её использовании в Python.
Эта статья не обучит Dас программированию OpenGL, но после её прочтения
Dы получите общее представление об этой библиотеке и её использовании в
Питоне.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 - дело нелёгкое и небыстрое. Этому не научишься за один час или за один день. Опыт накапливается вместе с числом написанных программ. Так что старайтесь при обучении побольше экспериментировать и создавать что-нибудь своими руками - и у Вас всё получится. |