А вы в курсе, что уже почти 2015 год и используемый вами opengl 3.0 устарел лет на 7?
И начиная чуть ли не с opengl 3.2 (2009г.) нужно включать специальный режим совместимости, чтобы это старьё заработало (возможно, он включается где-то в glutInit)
Устарел неверное слово, правильно говорить разделился на 2 ветки, режим ядра и режим совместимости с первоначальным стандартом. Режим ядра штука хорошая, но он как ассемблер требует написание всего с нуля, там нет ни матриц ни понятного интуитивно функционала, поэтому для познания основ 3D не особо подходит, да и под питоном возникнет рад дополнительных сложностей связанных с манипуляцией структурированными данными. Код выше представленной ёлочки растянулся бы раз в 5-10 =) Да и статьи бы как таковой небыло, потому что автор до сих пор ломал голову над шейдерами, матрицами и математикой построения цилиндра.
«написание с нуля» требуется ровно на столько же, насколько для и ёлочки требуется glBegin/glEnd и смена цвета карандашика, с которым черепашка ползает от вертекса к вертексу.
glut — это библиотека, работающая на стороне пользовательского кода, а нечасть opengl api.
Под новые стандарты есть новые библиотеки. В частности — glm. Вот на питоне развечто glm нету, это да. Зато есть numpy.
А за семь лет подобных статей написано уже стопицот. От автора каждой «hello, ёлочка». Смысла в стопицот первой особо нету.
А вот по новому api какраз нифига нет, кроме opengl-tutorial.org
И как прикрутить его к питону, к numpy — совершенно не очевидно.
В курсе что устарел (но не смотря на это без проблем работает и на современном железе), но для того, чтобы пример получился насколько возможно простым, использовал старый API. PyOpenGl дает возможность использовать и современный API с шейдерами и отрисовкой всего за один проход, но пример в таком случае (на мой взгляд) получился бы слишком усложненным и непонятным для новичков.
Думаю, стоит прислушаться к Ваши словам и попробовать написать вторую версию этой программа на современном OpenGL. Спасибо за комментарий. Если у меня получится задуманное, обязательно сделаю отдельный пост.
Мы вращаем объекты используя последовательность вызовов glRotatef по различным осям. Это дает не совсем тот результат, который можно ожидать (матрицы вращения накладываются друг на друга). Наиболее правильно осуществлять вращение трехмерных объектов с использованием кватернионов (Статья).
PyOpenGL для начинающих и немного новогоднего настроения