Как добавить вершины в сцену OpenGL, когда она уже загружена? - PullRequest
2 голосов
/ 17 апреля 2019

Я использую python для создания кубического приложения Рубика с OpenGL и pyGame. Я вижу куб и хочу нажать кнопку и загрузить цвета, но цвета не отображаются. (Я окрашиваю каждый маленький кубик в одиночку, но не думаю, что это имеет значение).

Если я вызываю функцию, которая окрашивает куб в функции, которая рисует вершины для куба (в начале программы), цвета прекрасно отображаются, но если я вызываю функцию цвета с нажатием клавиши (используя pyGame), когда приложение уже запущено, но не работает.

функция, которая окрашивает маленький кубик:

def color_cubie(self):
    surfaces = (
        (0, 1, 2, 3),
        (4, 5, 6, 7),
        (0, 3, 7, 4),
        (1, 2, 6, 5),
        (2, 3, 7, 6),
        (0, 1, 5, 4)
        )
    colors = [
        (1, 0, 0), (1, 0.5, 0),   
        (0, 1, 0), (0, 0, 1),          
        (1, 1, 1), (1, 1, 0)     
        ]

    #faces
    glBegin(GL_QUADS)
    index=0
    for surface in surfaces:
        glColor3fv(colors[index])
        for vertex  in surface:
            glVertex3fv(self.verticies[vertex])
        index+=1
    glEnd()

часть, которую я вызываю функцией (оператор if равен true, когда я нажимаю клавишу c на клавиатуре). Также куб является массивом 3x3x3, который заполнен объектами cubie.

if move == "c":
    for row in self.cube[2]:
        for cubie in row:
            cubie.color_cubie()

функция main / render:


def render():
    pygame.init()
    display = (WIDTH, HEIGHT)
    screen = pygame.display.set_mode(display, DOUBLEBUF|OPENGL)
    pygame.display.set_caption("Rubiks Cube")

    glEnable(GL_DEPTH_TEST)
    glClearColor(1, 1, 1, 1)
    gluPerspective(45, (display[0]/display[1]), 0.1, 50.0)
    glTranslatef(0.0, 0.0, -7)
    glLineWidth(10)

    while True:              
        mouse_pos = pygame.mouse.get_rel()
        glRotatef(1, mouse_pos[1], mouse_pos[0], 0)
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)

        #create cube object
        new_cube = Cube()
        new_cube.show_cube()

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

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == pygame.KEYDOWN:
                if event.key == K_c:
                    new_cube.rotate_cube("c")

Когда я читаю, я должен перерисовать экран, чтобы увидеть цветной куб. Но glClear (...) не делает этого?

1 Ответ

1 голос
/ 17 апреля 2019

new_cube.rotate_cube("c") выполняется только один раз при нажатии клавиши. Это приводит к тому, что цвета мигают только в течение короткого момента.

Вы должны добавить состояние (self.colored) к классу Cube, которое указывает, должен ли быть нарисован цветной куб или линии. Когда new_cube.color_cubie вызывается для изменения состояния переменной:

, например

class Cube:

    def __init__(self):
        self.colored = False
        # [...]

    def color_cubie(self):
        self.colored = True # change state, from now on draw colored 

    def show_cube(self)
        if self.colored:
            self.drawColored()
        else:
            self.drawLines()


    def drawLines(slef):
        # draw the lines here
        # [...]


    def drawColored(self):
        # draw the colored cube here
         # [...]
...