Pyglet on_draw не будет рисовать обновленную функцию - PullRequest
1 голос
/ 04 мая 2020

Функция crtaj () (основная функция рисования) принимает две глобальные матрицы, «T» и «P», применяет преобразования к глобальным вершинам «vrhovi» с использованием двух матриц и сохраняет преобразованные вершины в «novivrhovi», а затем др aws полигон с использованием преобразованных вершин "новиврхови" и глобальных "полигонов" (описывает соединения вершин). Когда клавиша «вверх» нажата, матрицы «Т» и «Р» обновляются. Что я хочу, так это рисовать на каждом из этих обновлений, но после начального рисования экран гаснет после первого нажатия «вверх». Я на 100% уверен, что с моими преобразованиями все в порядке, потому что нажатие клавиши один раз дает матрицы, для которых я попытался установить их в качестве начальных, и это правильно делает dr aws, поэтому нет причин не рисовать правильно при использовании начальных значений по умолчанию и нажатии вверх, потому что результат тот же, и функция даже печатает правильные вершины каждый раз, когда я нажимаю «вверх», но просто ничего не показывает.

@window.event
def on_draw():

    glScalef(150,150,150)
    glTranslatef(sum(xkord)/2,sum(ykord)/2,0)

    window.clear()
    crtaj()


@window.event
def on_key_press(key, modifiers):
    global vrhovi

    if (key == pyglet.window.key.UP):
        ociste[0][0]=ociste[0][0]+1
        transform()
        on_draw()

#main draw
def crtaj():


    glBegin(GL_LINE_LOOP)
    global T
    global P
    global vrhovi
    global poligoni

    #calculate new vertices of polygon-->novivrhovi

    novivrhovi = []

    for vrh in vrhovi:
        novivrh = vrh.copy()
        novivrh.append(1)
        novivrh = np.matrix(novivrh)
        novivrh = novivrh.dot(T)
        novivrh = novivrh.dot(P)
        novivrh = novivrh.tolist()
        novivrhovi.append(novivrh[0])
    print("N O V I V R H O V I")
    print(novivrhovi)

    #draw the poligon
    for poligon in poligoni:

        index0 = poligon[0]-1
        index1 = poligon[1]-1
        index2 = poligon[2]-1

        glVertex4f(novivrhovi[index0][0],novivrhovi[index0][1],novivrhovi[index0][2],novivrhovi[index0][3])
        glVertex4f(novivrhovi[index1][0],novivrhovi[index1][1],novivrhovi[index1][2],novivrhovi[index1][3])
        glVertex4f(novivrhovi[index2][0],novivrhovi[index2][1],novivrhovi[index2][2],novivrhovi[index2][3])
    glEnd()

pyglet.app.run()

1 Ответ

1 голос
/ 04 мая 2020

, но после начального рисования экран гаснет после нажатия первой клавиши "вверх".

Матричные операции Legacy OpenGL , такие как glScalef и glTranslatef не просто устанавливают матрицу, они определяют новую матрицу и умножают текущую матрицу на новую матрицу.
OpenGL - это механизм состояний, состояния сохраняются до тех пор, пока они не будут изменился снова, даже за рамками. Следовательно, в вашем приложении текущая матрица постепенно масштабируется и переводится.

Загрузка матрицы идентификаторов в начале on_draw:

@window.event
def on_draw():

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

    glScalef(150,150,150)
    glTranslatef(sum(xkord)/2,sum(ykord)/2,0)

    window.clear()
    crtaj()

PyGlet по умолчанию устанавливает проекцию Orthographi c матрица проецирования в пространство окна. Смотрите pyglet.window . Если вы хотите другую проекцию, ее можно установить с помощью glOrtho:

@window.event
def on_draw():

    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glOrtho(0, window.width, window.height, 0, -1, 1)

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

    glScalef(150,150,150)
    glTranslatef(sum(xkord)/2,sum(ykord)/2,0)

    window.clear()
    crtaj()
...