1

我正在尝试使用 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 循环中更改任何内容,它们都会一起改变。感谢帮助。

4

2 回答 2

0

尝试glLoadIdentity在绘制缓冲区之前调用

于 2019-07-07T16:49:46.177 回答
0

请注意,当前矩阵可以存储到矩阵堆栈中,也可以glPushMatrix从矩阵堆栈中恢复glPopMatrix。有不同的矩阵模式和矩阵堆栈(例如GL_MODELVIEWGL_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);

在绘制对象之前立即执行此操作。

于 2019-07-07T17:13:26.553 回答