Перемещение изображения в трехмерном пространстве - PullRequest
2 голосов
/ 07 октября 2011

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

Как быстрее всего (прочитайте кратчайший объем кода) использовать pyglet, чтобы получить дескриптор отображаемого четырехугольного квадрата, в котором я могу манипулировать положением и ориентацией указанного четырехугольника?

1 Ответ

6 голосов
/ 09 октября 2011

Ниже приведен самый простой код, который я смог придумать, который позволил мне расположить изображение в позиции (0, 0, -10):

#!/usr/bin/env python                                                           
import pyglet
from pyglet.gl import *

window = pyglet.window.Window()
glEnable(GL_DEPTH_TEST)

image = pyglet.image.load('imgs/appfolio.png')
texture = image.get_texture()
glEnable(texture.target)
glBindTexture(texture.target, texture.id)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image.width, image.height,
             0, GL_RGBA, GL_UNSIGNED_BYTE,
             image.get_image_data().get_data('RGBA', image.width * 4))

rect_w = float(image.width) / image.height
rect_h = 1

@window.event
def on_draw():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()
    glTranslatef(0, 0, -10)
    glBindTexture(texture.target, texture.id)
    glBegin(GL_QUADS)
    glTexCoord2f(0.0, 0.0); glVertex3f(-rect_w, -rect_h, 0.0)
    glTexCoord2f(1.0, 0.0); glVertex3f( rect_w, -rect_h, 0.0)
    glTexCoord2f(1.0, 1.0); glVertex3f( rect_w,  rect_h, 0.0)
    glTexCoord2f(0.0, 1.0); glVertex3f(-rect_w,  rect_h, 0.0)
    glEnd()

def on_resize(width, height):
    glViewport(0, 0, width, height)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(65.0, width/float(height), 0.1, 1000.0)
    glMatrixMode(GL_MODELVIEW)

window.on_resize = on_resize # we need to replace so can't use @window.event    
pyglet.app.run()

Самая сложная часть, которую я нашел, заключалась в том, чтоФункция on_resize должна была быть заменена, чтобы работать так, как я ожидал, так как стандартная ортографическая проекция не работает.

Я обнаружил преобразование Пиглета Джесс Хилл из NeHeУчебник по наложению текстур будет наиболее полезным.

Полный код визуализации логотипа можно найти в записи блога, которую я только что написал, под названием " Перемещение изображений в 3D-пространстве с помощью Pyglet ".

...