2015-02-21 3 views
0

Я пытался сделать то, что делается здесь: http://pythonprogramming.net/opengl-pyopengl-python-pygame-tutorial/Pygame/PyOpenGL форма меняется, когда размер дисплея изменяется

И в то время как все выглядит в основном то же самое, мой куб выглядит как прямоугольная призма.

Переключение размеров дисплея на 600x600 делает его кубом, но я хочу сохранить его на 800x600 (или я хочу, чтобы объекты искажались независимо от размера окна).

Есть ли способ сделать это (я понимаю, что автор работает с python3, и я делаю python2.7, это проблема или есть обходной путь)?

Вот мой код

#!/usr/bin/env python 
import pygame 
from pygame.locals import * 

from OpenGL.GL import * 
from OpenGL.GLU import * 

vertices = (
    (1, -1, -1), 
    (1, 1, -1), 
    (-1, 1, -1), 
    (-1, -1, -1), 
    (1, -1, 1), 
    (1, 1, 1), 
    (-1, -1, 1), 
    (-1, 1, 1) 
    ) 

edges = (
    (0,1), 
    (0,3), 
    (0,4), 
    (2,1), 
    (2,3), 
    (2,7), 
    (6,3), 
    (6,4), 
    (6,7), 
    (5,1), 
    (5,4), 
    (5,7) 
    ) 

surfaces = (
    (0, 1, 2, 3), 
    (3, 2, 7, 6), 
    (6, 7, 5, 4), 
    (4, 5, 1, 0), 
    (1, 5, 7, 2), 
    (4, 0, 3, 6), 
    ) 

colors = (
    (1, 0, 0), 
    (1, 0, 0), 
    (0, 0, 1), 
    (0, 0, 0), 
    (1, 1, 1), 
    (0, 1, 1), 
    (1, 0, 0), 
    (1, 0, 0), 
    (0, 0, 1), 
    (0, 0, 0), 
    (1, 1, 1), 
    (0, 1, 1), 
    ) 

def Cube(): 
    glBegin(GL_QUADS) 
    for surface in surfaces: 
     x = 0 
     for vertex in surface: 
      x = (x + 1) % 12 
      glColor3fv(colors[x]) 
      glVertex3fv(vertices[vertex]) 
    glEnd() 
    glBegin(GL_LINES) 
    for edge in edges: 
     for vertex in edge: 
      glVertex3fv(vertices[vertex]) 
    glEnd() 

def main(): 
    pygame.init() 
    display = (800,600) 
    pygame.display.set_mode(display, DOUBLEBUF|OPENGL) 
    gluPerspective(45, (display[0]/display[1]), 0.1, 50.0) 
    glTranslatef(0, 0, -40) 
    glRotatef(0, 0, 0, 0) 
    loop = True 
    while loop: 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       pygame.quit() 
       quit() 

      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_LEFT: 
        glTranslatef(0.5, 0, 0) 
       if event.key == pygame.K_RIGHT: 
        glTranslatef(-0.5, 0, 0) 
       if event.key == pygame.K_UP: 
        glTranslatef(0, -0.5, 0) 
       if event.key == pygame.K_DOWN: 
        glTranslatef(0, 0.5, 0) 
       if event.key == pygame.K_SPACE: 
        loop = False 
     #glRotatef(1, 3, 1, 1) 
     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) 
     glTranslatef(0,0,0.1) 
     Cube() 
     pygame.display.flip() 
     pygame.time.wait(10) 

main() 

Спасибо!

ответ

0

Проблема в том, что вы используете python 2.7, и есть легкая работа.

В питоне 3 деления по умолчанию с плавающей точкой:

>>> 800/600 
1.3333333333333333 

В то время как в Python 2.7 это число:

>>> 800/600 
1 

легко исправить было бы изменить эту строку:

gluPerspective(45, (display[0]/display[1]), 0.1, 50.0) 

С

gluPerspective(45, (1.0*display[0]/display[1]), 0.1, 50.0) 
Смежные вопросы