2015-01-23 3 views
0

Я хотел бы отобразить изображение на прямоугольник в 3d пространстве с pyOpengl и pygame.Отображение изображения OpenGL в 3d пространстве

Я не против, если изображение отключено. Вот мой код с несколькими OPENGL функций, которые я знаю для отображения изображения:

import pygame, OpenGL, math, numpy 
from pygame.locals import * 
from OpenGL.GL import * 
from OpenGL.GLU import * 
from PIL import Image #have Pillow instead of PIL 

img = Image.open('myPixelArt.bmp') 
img_data = numpy.array(list(img.getdata()), numpy.int8) 
im = glGenTextures(1,img) 
glPixelStorei(GL_UNPACK_ALIGNMENT,4) 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP) 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP) 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) 
glTexImage2D(GL_TEXTURE_2D, 5, GL_RGB, img.size[0], img.size[1], 0, GL_RGB, GL_UNSIGNED_BYTE, img_data) 
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, img.size[0], img.size[1], GL_RGB, GL_UNSIGNED_BYTE, img_data); 
def wall(image): #I would like the image on this wall 
    glColor((1,0,0)) 
    glBindTexture(GL_TEXTURE_2D,image) 
    glBegin(GL_QUADS) 
    glTexCoord2f(0,0) 
    glVertex3f(-4,-4,-8) 
    glTexCoord2f(1,0) 
    glVertex3f(-4,4,-8) 
    glTexCoord2f(1,1) 
    glVertex3f(4,4,-8) 
    glTexCoord2f(0,1) 
    glVertex3f(4,-4,-8) 
    glEnd() 

def main(): 
    pygame.init() 
    display = (600,600) 
    screen = pygame.display.set_mode(display, DOUBLEBUF|OPENGL) 
main() 

while True: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit() 

    glLoadIdentity() 
    gluPerspective(45, 1, 0.05, 100) 
    glEnable(GL_TEXTURE_2D) 

    glTranslatef(0,0,-5) 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) 

    wall(im) 

    pygame.display.flip() 
    pygame.time.wait(50) 

Однако, если я называю стену (IMG) вместо этого, я получаю

File "C:\Users\Matt\Desktop\MattPython\Stackoverflow.py", line 19, in wall 
    glBindTexture(GL_TEXTURE_2D,image) 
ArgumentError: argument 2: <type 'exceptions.TypeError'>: wrong type 
+2

Каждой вершине нужны обе ее координаты в реальном пространстве (posit ion) * и * координаты 2D-текстуры, чтобы указать, к какой части изображения они сопоставляются, - чтобы отобразить все изображение в прямоугольник, используйте (0,0), (1,0), (1,1), (0 , 1). – orion

+0

Правильно, вам нужно использовать функцию gl с этим? вы вводите одну координату 2d после одной 3d-координаты или выполняете все четыре 3d-координаты, а затем все четыре (или восемь?) 2d-координаты? –

+0

Вы указываете их перед объявлением каждой вершины ... так что glTexCoord2f для первой вершины glVertex3f для первой вершины, ... то же самое для второй вершины ... вам не нужно использовать версию '3fv', которая принимает векторы, если вы задают componentencs, просто используйте '3f'. – orion

ответ

0

Я получил это работает, исправлено несколько вещей:

1) необходимо было позвонить pygame.init() и pygame.display.set_mode (что составляет main()) до glGenTextures.

2) использовали pygame.image.load вместо Image.open

3) использовали pygame.image.tostring(img, "RGB", 1) вместо numpy.array(list(img.getdata()), numpy.int8)

4) необходимо вызвать glBindTexture перед тем glTexParameteri

Это мой рабочий пример:

import pygame, OpenGL 
from pygame.locals import * 
from OpenGL.GL import * 
from OpenGL.GLU import * 

def main(): 
    pygame.init() 
    pygame.display.set_mode((600,600), DOUBLEBUF|OPENGL) 
main() 

img = pygame.image.load('myPixelArt.bmp') 
textureData = pygame.image.tostring(img, "RGB", 1) 
width = img.get_width() 
height = img.get_height() 

im = glGenTextures(1) 
glBindTexture(GL_TEXTURE_2D, im) 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, textureData) 
glEnable(GL_TEXTURE_2D) 

def wall(image): 
    glBegin(GL_QUADS) 
    glTexCoord2f(0,0) 
    glVertex3f(-4,-4,-16) 
    glTexCoord2f(0,1) 
    glVertex3f(-4,4,-16) 
    glTexCoord2f(1,1) 
    glVertex3f(4,4,-8) 
    glTexCoord2f(1,0) 
    glVertex3f(4,-4,-8) 
    glEnd() 

while True: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit() 

    glLoadIdentity() 
    gluPerspective(45, 1, 0.05, 100) 
    glTranslatef(0,0,-5) 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) 

    wall(im) 

    pygame.display.flip() 
    pygame.time.wait(50)