Как использовать несколько glViewport () и glOrtho () - PullRequest
1 голос
/ 07 июля 2019

Я пытаюсь использовать pygame и pyopengl, в главном окне у меня есть 2 видовых экрана 1 большая карта и 1 мини-карта (оба представляют один и тот же кадр). Мне нужно, чтобы обе карты вращались вокруг центра, который не имеет 0,0,0 (скажем, мне нужно, чтобы центр вращения был -130,0,60, который должен быть постоянной точкой)

также мне нужен 1 вид для просмотра расстояния glTranslatef(0, 0, -1000) и 2-й вид будет glTranslatef(1, 1, -200) оба расстояния постоянны

я пытался использовать

gluLookAt()
glOrtho()

но это не меняет вращение .... около 0,0,0 или я могу использовать это неправильно.

код выглядит так:

pygame.init()
display = (1700, 1000)
pygame.display.set_mode(display, DOUBLEBUF | OPENGL)
gluPerspective(50, (display[0] / display[1]), 0.1, 5000)
glTranslatef(0, 0, -1000) # this is the view distance i want from map 1
while True:

   ##### i use this function to zoom in and out with mouse Wheel
   ##### also the zoom in/out zooms to 0,0,0 and i need (-130,0,60)
   if move_camera_distance:
        if zoom_in:
            glScalef(0.8,0.8,0.8)
        elif zoom_out:
            glScalef(1.2, 1.2, 1.2)
        move_camera_distance = False
        zoom_in = False
        zoom_out = False        


    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    ###### Map 1 
    ###### Need to rotate around (-130,0,60)
    ###### distance from camera need to be (0,0,-1000)
    glViewport(1, 1, display[0], display[1])  # splits the screen
    glCallList(obj.gl_list)
    DrawBuffer(bufferObj, noPoints, noCirclePoints, noCrossPoints) 


    ###### Map 2
    ###### Need to rotate around (-130,0,60)
    ###### distance from camera need to be (0,0,-300)
    glViewport(1300, 650, 400, 400)  # splits the screen
    glCallList(obj.gl_list)
    DrawBuffer(bufferObj, noPoints, noCirclePoints, noCrossPoints)

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

Выходные данные, которые я получаю, равны 2 картам, оба вращаются вокруг 0,0,0, оба находятся на расстоянии (0,0, -1000), и оба меняются вместе, если я что-то изменяю в цикле While. спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 07 июля 2019

Обратите внимание, что текущая матрица может быть сохранена в стеке матриц с помощью glPushMatrix и восстановлена ​​из стека матриц с помощью glPopMatrix.Существуют разные матричные режимы и матричные стеки (например, GL_MODELVIEW, GL_PROJECTION).См. (glMatrixMode).

Установите матрицу проекции при инициализации и установите разные матрицы вида модели для разных видов:

glMatrxMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(50, (display[0] / display[1]), 0.1, 5000)

glMatrxMode(GL_MODELVIEW)
glLoadIdentity()
# [...]

while True:

    ###### Map 1 
    glViewport(1, 1, display[0], display[1])  # splits the screen

    glPushMatrix()
    glTranslatef(0, 0, -1000) # this is the view distance i want from map 1
    # [...]
    glPopMatrix()


    ###### Map 2
    glViewport(1300, 650, 400, 400) # splits the screen

    glPushMatrix()
    glTranslatef(0, 0, -300) # this is the view distance i want from map 1
    # [...]
    glPopMatrix()


Чтобы повернутьДля модели вокруг точки вы должны:

  • Перевести модель таким образом, чтобы стержень находился в происхождении мира.Это перевод по обратному центру вектора.
  • Поворот модели.
  • Переведите прямоугольник таким образом, чтобы ось вернулась в исходное положение.

В программе эти операции должны выполнятьсяприменяется в обратном порядке, потому что такие операции, как glTranslate и glRotate определяют матрицу и умножают матрицу на текущую матрицу:

glTranslatef(-130, 0, 60);
glRotate( ... )
glTranslatef(130, 0, -60);

Сделайте этонепосредственно перед тем, как нарисовать объект.

0 голосов
/ 07 июля 2019

Попробуйте вызвать glLoadIdentity до рисования буферов

...