Python Qt + OpenGL绘图区域错误

tttaaabbb

我有用于OpenGl的简单代码,但是图形区域无法正确显示,当我希望全尺寸显示时,大约为100x30。但是,我的OpenGl小部件具有正确的清除行为。我怎样才能解决这个问题?

from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
from PyQt4 import QtCore, QtGui, QtOpenGL
import sys
try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

try:
    from OpenGL import GL
except ImportError:
    app = QtGui.QApplication(sys.argv)
    QtGui.QMessageBox.critical(None, "OpenGL hellogl",
            "PyOpenGL must be installed to run this example.")
    sys.exit(1)


class Ui_Form(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.setupUi(self)
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(700, 532)


        self.openGLWidget = GLWidget(Form)
        self.openGLWidget.setGeometry(QtCore.QRect(10 , 10, 512, 512))
        self.openGLWidget.setObjectName("openGLWidget")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(_translate("Form", "Form", None))

class GLWidget(QtOpenGL.QGLWidget):
    def __init__(self, parent=None):

        super(GLWidget, self).__init__(parent)


    def initializeGL(self):
        GL.glClearColor(0,255,0,255)

    def paintGL(self):


        glEnable(GL_TEXTURE_2D)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

        glLoadIdentity()

        gluOrtho2D(0, 1, 0, 1);

        glColor3f(1, 0, 0)
        glDisable(GL_TEXTURE_2D)
        glBegin(GL_QUADS)
        glVertex2i(0, 0)
        glVertex2i(1000, 0)
        glVertex2i(1000, 1000)
        glVertex2i(0, 1000)
        glEnd();

        glFlush()




if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    window = Ui_Form()
    window.show()
    sys.exit(app.exec_())

我试图更改glOrtho并添加了一些过剩功能,但没有结果。我也尝试添加矩阵乘法来缩放它,似乎显示区域有一些错误的值。

在此处输入图片说明

拉比德76

您必须设置视口大小。glViewport

void glViewport( GLint x, GLint y, GLsizei width, GLsizei height);

xy指定视口矩形的左下角,以像素为单位。初始值为(0,0)。
widthheight指定视口的宽度和高度。

glViewport指定的仿射变换xy从归一化设备坐标到窗口坐标。


您的代码应如下所示:

def paintGL(self):

    width = 512
    height = 512

    glViewport(0, 0, width, height)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluOrtho2D(0, width, 0, height)

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

    glColor3f(1, 0, 0)
    glBegin(GL_QUADS)
    glVertex2i(0, 0)
    glVertex2i(width, 0)
    glVertex2i(width, height)
    glVertex2i(0, height)
    glEnd()

    glFlush()

注意,在OpenGL中,每种矩阵模式都有一个矩阵堆栈(请参阅参考资料glMatrixMode)。矩阵模式GL_MODELVIEWGL_PROJECTION以及GL_TEXTURE因此,您应该设置投影矩阵(GL_PROJECTION)和模型视图矩阵(GL_MODELVIEW),因为每个顶点都由模型视图矩阵和投影矩阵进行变换。


请参阅进一步的QT + OPENGL代码示例


顺便说一下,的参数glClearColor是[0,1]范围内的浮点值。更改方法initializeGL

def initializeGL(self):
    GL.glClearColor(0,1,0,1)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章