【问题标题】:Change perspective of a PyOpenGL widget更改 PyOpenGL 小部件的透视图
【发布时间】:2019-07-30 20:15:21
【问题描述】:

我正在尝试在 PyQt5 OpenGL 小部件中更改场景的视角。我知道我必须重写一些方法,但我不知道应该使用哪一个。

def initializeGL(self):
    glClear(GL_COLOR_BUFFER_BIT)
    glEnable(GL_DEPTH_TEST)

def paintGL(self):
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glBegin(GL_LINES)
    # More code

我应该在哪里使用glOrtho 函数?我在哪里可以找到有关覆盖此方法的信息? 当我去到这个方法的声明时,它们只有一个 pass 语句,没有别的,它们是如何以及何时执行的?我应该使用QPainter 而不是 OpenGL?

    def __init__(self, parent=None):
        super().__init__(parent)
        self._x = 0
        self._y = -0.3
        self._z = 0.5
        self._rz = 0
        self._ry = -0.5
        self.vertices_vertical = [[1000, 1000, 000], [1000, -1000, 000],
                                  [-1000, -1000, 000], [-1000, 1000, 000]]
        self.vertices_horizontal = [[1000, 000, -1000], [1000, 000, 1000],
                                    [-1000, 000, 1000], [-1000, 000, -1000]]
    def initializeGL(self):
        glClear(GL_COLOR_BUFFER_BIT)
        glEnable(GL_DEPTH_TEST)
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        glOrtho(0, 1000, 750, 0, -1, 1)

    def paintGL(self):
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()
        glBegin(GL_LINES)

        glColor3d(1, 0, 0)
        glVertex3d(0, 0, 0)
        glVertex3d(1, 0, 0)

        glColor3d(0, 1, 0)
        glVertex3d(0, 0, 0)
        glVertex3d(0, 1, 0)

        glColor3d(0, 0, 1)
        glVertex3d(0, 0, 0)
        glVertex3d(0, 0, 1)

        glEnd()
        # glLoadIdentity()

        glTranslate(self._x, self._y, self._z)
        glRotate(self._ry, 0, 1, 0)
        glRotate(self._rz, 0, 0, 1)

        glEnable(GL_BLEND)
        glBlendFunc(GL_SRC_ALPHA, GL_DST_COLOR)
        glBegin(GL_QUADS)
        glColor4fv((0, 1, 0, 0.6))
        for vertex in range(4):
            glVertex3fv(self.vertices_vertical[vertex])
        glColor4fv((1, 0, 0, 0.6))
        for vertex in range(4):
            glVertex3fv(self.vertices_horizontal[vertex])
        glEnd()
        glDisable(GL_BLEND)

【问题讨论】:

标签: python-3.x opengl pyqt5 pyopengl opengl-compat


【解决方案1】:

Legacy OpenGL 中,当前矩阵是一个全局状态。有不同种类的矩阵,每一种矩阵都存在一个矩阵栈。矩阵堆栈的顶部是当前矩阵。矩阵栈是后续矩阵运算的目标,如glOrthoglPushMatrix/glPopMatrixglLoadIdentity等。可以通过glMatrixMode选择。

每个顶点坐标 (glVertex) 由模型视图矩阵 (GL_MODELVIEW) 和投影矩阵 (GL_PROJECTION) 转换。

initializeGL中选择投影矩阵模式。设置Identity matrix 并通过glOrtho 设置正交投影。请注意,glOrtho 不仅设置了一个矩阵,它还定义了一个Orthographic projection 矩阵并将当前矩阵乘以新矩阵。

例如设置正交投影,将“窗口”坐标转换为规范化的设备空间。下面(windowdWidth,windowHeight)是窗口的大小:

def initializeGL(self):
    glClear(GL_COLOR_BUFFER_BIT)
    glEnable(GL_DEPTH_TEST)

    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glOrtho(0, windowdWidth, windowHeight, 0, -1, 1) 

在绘制模型之前,使用模型视图矩阵模式设置模型视图转换:

def paintGL(self):
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    # model view transformations
    # [...]

    glBegin(GL_LINES)
    # [...]
    glEnd()

【讨论】:

  • @PepeElMago33 你在哪里工作glTranslate?它有什么作用,你期望它做什么?
  • 我刚刚添加了paintGL函数。我使用该功能移动空间中的“相机”,我知道我正在移动所有东西
  • @PepeElMago33 正交投影改变了投影的比例。当您使用glOrtho(0, windowdWidth, windowHeight, 0, -1, 1) 时,平移 0.5 是半像素。使用glOrtho(0, 1, 1, 0, -1, 1)glOrtho(-1, 1, 1, -1, -1, 1) 来查看区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
相关资源
最近更新 更多