【问题标题】:modelview matrix not updated using pyopengl and pyqt未使用 pyopengl 和 pyqt 更新模型视图矩阵
【发布时间】:2013-12-01 19:29:30
【问题描述】:

我正在使用 PyQt 和 PyOpenGl,当我尝试翻译/平移时,我在更新 modelview matrix 时遇到了一些问题。绘图/绘画在方法paintGL

中完成
def paintGL(self):
        """
        display geometry
        """
        # Clear the screen
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

        #    setup camera
        glMatrixMode(GL_MODELVIEW)

        #    drawing here....

翻译/平移在方法mouseMoveEvent中调用

def mouseMoveEvent(self, event):
        dx = dxy.x() 
        dy = dxy.y() 
        if event.buttons() & Qt.MidButton:
            #    translate
            if event.modifiers() & Qt.ControlModifier:
                self.camera.translate(dx, dy, 0)

Camera 对象的方法translate 是:

class Camera(object):
    '''
    Connection between mouse motion and transformation matrix
    '''
    def __init__(self):
        self.currentMatrix = []
        self.reset()

    def reset(self):
        glPushMatrix()
        glLoadIdentity()
        self.currentMatrix = glGetDoublev(GL_MODELVIEW_MATRIX)
        glPopMatrix()

    def translate(self, x, y, z):
        glPushMatrix()
        glLoadIdentity()
        glTranslatef(tx, ty, tz)
        glMultMatrixf( self.currentMatrix )
        self.currentMatrix = glGetFloatv( GL_MODELVIEW_MATRIX )
        glPopMatrix()

我遇到的问题是modelview matrix 被转换(在翻译时 - 移动鼠标)但在绘制之前modelview matrix 再次等于glLoadIdentity()。如何修改代码解决问题?

【问题讨论】:

    标签: python opengl matrix pyqt pyopengl


    【解决方案1】:

    如果其他人会遇到类似的问题,我会在此处发布阻止我解决问题的解决方案。在OpenGLWidget 类中,我有以下代码(以及其他代码):

    class OpenGLWidget(QtOpenGL.QGLWidget):
        def __init__(self, parent=None):
            self.parent = parent
            self.camera = camera_view.View()
    

    因为在初始化 OpenGL 之前调用了 View 类,它总是将 GL_MODELVIEW_MATRIX 作为零矩阵返回。 我的解决方案如下;代码:

    self.camera = camera_view.View()

    移动到初始化OpenGL的方法即:

    def initializeGL(self):
        #    background color
        glClearColor(0,0.0,0,1)
    
        glEnable(GL_DEPTH_TEST)
        glShadeModel(GL_SMOOTH) 
        glEnable(GL_NORMALIZE)
        glEnable(GL_CULL_FACE)
    
        #    lights settings
        glEnable( GL_LIGHTING )
        glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, 0 )
        glEnable( GL_LIGHT0 )
        light_pos_0 = np.array([0.0, 10.0, 10.0])
        glLightfv( GL_LIGHT0, GL_POSITION, light_pos_0 )
        glLightfv( GL_LIGHT0, GL_AMBIENT, [0.8, 0.8, 0.8, 1] )
        glLightfv( GL_LIGHT0, GL_DIFFUSE, [1, 1, 1, 0] )
        glLightfv( GL_LIGHT0, GL_SPECULAR, [1, 1, 1, 0] )
    
        #    camera
        self.camera = camera_view.View()
        #    viewing
        self.geometry()
    

    希望对任何人都有帮助。

    【讨论】:

      猜你喜欢
      • 2018-08-19
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 2016-01-08
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多