glOrtho 不工作它仍然被映射到默认坐标

Posted

技术标签:

【中文标题】glOrtho 不工作它仍然被映射到默认坐标【英文标题】:glOrtho doesent work it still gets mapped to default coordinates 【发布时间】:2021-05-25 06:11:36 【问题描述】:

所以我在 python 中使用 pyopengl 来使用 opengl 但是当我在我的 reshape 函数中使用 glOrtho 来映射我的坐标时它不起作用它仍然被映射到 -1 - 1 这是我的代码:

from OpenGL.GLUT import *
from OpenGL.GL import *

width, height = 500,500

def rectangle(x, y, width, height, color, fill):
    if fill:
        glBegin(GL_POLYGON)
        glColor3ub(color[0], color[1], color[2])
        glVertex2f(x - width/2, y + height/2)
        glVertex2f(x + width/2, y + height/2)
        glVertex2f(x + width/2, y - height/2)
        glVertex2f(x - width/2, y - height/2)
        glColor3ub(255, 255, 255)
        glEnd()
    else:
        glBegin(GL_LINES)
        glColor3ub(color[0], color[1], color[2])
        glVertex2f(x - width/2, y + height/2)
        glVertex2f(x + width/2, y + height/2)
        glVertex2f(x + width/2, y - height/2)
        glVertex2f(x - width/2, y - height/2)
        glColor3ub(255, 255, 255)
        glEnd()

def draw():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glClearColor(0.25, 0.25, 0.25, 1)
    glLoadIdentity()

    glBegin(GL_POLYGON)
    glVertex2f(1, 1)
    glVertex2f(-1, 1)
    glVertex2f(-1, -1)
    glVertex2f(100, -1)
    glEnd()

    glutSwapBuffers()


def reshape(w, h):
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glOrtho(0, w, 0, h, 0, 1000)


glutInit()
glutInitDisplayMode(GLUT_RGBA) # Set the display mode to be colored
glutInitWindowSize(width, height)   # Set the w and h of your window
glutInitWindowPosition(0, 0)   # Set the position at which this windows should appear
window = glutCreateWindow("OpenGL") # Set a window title
glutReshapeFunc(reshape)
glutDisplayFunc(draw) # defines display func
glutIdleFunc(draw) # Keeps the window open
glutMainLoop()  # Keeps the above created window displaying/running in a loop

帮我解决这个问题,我看不出它不起作用的原因

【问题讨论】:

【参考方案1】:

glOrtho 不起作用,因为在 draw 函数中的 glLoadIdentity() 指令中。 glLoadIdentity() 加载 Identity matrix。将glOrtho 之后的矩阵模式更改为glMatrixMode。这确保了投影矩阵被保留,但单位矩阵被加载到模型视图矩阵中。 OpenGL 是一个状态引擎。一旦状态被改变,它会一直保留到它再次改变,甚至超出帧。

def reshape(w, h):
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glOrtho(0, w, 0, h, 0, 1000)
    glMatrixMode(GL_MODELVIEW)

【讨论】:

以上是关于glOrtho 不工作它仍然被映射到默认坐标的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL glOrtho 设置匹配窗口大小

R数据可视化----ggplot2之标度坐标轴和图例详解

OpenGL 4.3错误地将第4个纹理坐标映射到与第3个纹理坐标相同的位置

必应地图搜索默认为兰开斯特

默认Java库路径?

将特定 servlet 映射为 Tomcat 中的默认 servlet