如何使用多个 glViewport() 和 glOrtho()
How to use multiple glViewport() and glOrtho()
我正在尝试使用 pygame 和 pyopengl,主要 window 我有 2 个视口
1 张大地图和 1 张小地图(均呈现同一帧)。我需要两个地图都围绕一个不是 0,0,0 的中心旋转(假设我需要旋转中心为 -130,0,60,这需要是一个常数点)
我还需要 1 个视图才能查看 glTranslatef(0, 0, -1000)
的距离
第二个视图是 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 循环中更改任何内容,它们都会一起改变。
感谢您的帮助。
注意可以通过glPushMatrix
and restored from the matrix stack by glPopMatrix
. There are different matrix modes and matrix stacks (e.g. GL_MODELVIEW
, GL_PROJECTION
). See (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
and glRotate
这样的操作定义了一个矩阵并将该矩阵与当前矩阵相乘:
glTranslatef(-130, 0, 60);
glRotate( ... )
glTranslatef(130, 0, -60);
在绘制对象之前立即执行此操作。
我正在尝试使用 pygame 和 pyopengl,主要 window 我有 2 个视口 1 张大地图和 1 张小地图(均呈现同一帧)。我需要两个地图都围绕一个不是 0,0,0 的中心旋转(假设我需要旋转中心为 -130,0,60,这需要是一个常数点)
我还需要 1 个视图才能查看 glTranslatef(0, 0, -1000)
的距离
第二个视图是 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 循环中更改任何内容,它们都会一起改变。 感谢您的帮助。
注意可以通过glPushMatrix
and restored from the matrix stack by glPopMatrix
. There are different matrix modes and matrix stacks (e.g. GL_MODELVIEW
, GL_PROJECTION
). See (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
and glRotate
这样的操作定义了一个矩阵并将该矩阵与当前矩阵相乘:
glTranslatef(-130, 0, 60);
glRotate( ... )
glTranslatef(130, 0, -60);
在绘制对象之前立即执行此操作。