2013-11-18 5 views
0

Я использую PyQt и PyOpenGl, и у меня есть некоторые проблемы с обновлением modelview matrix, когда я пытаюсь перевести/панорамировать. Рисунок/живопись делается в методе paintGLmodelview matrix не обновляется с использованием pyopengl и pyqt

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(). Как можно изменить код для решения проблемы?

ответ

0

Если у кого-то еще будут проблемы с подобными проблемами, я размещаю здесь решение, которое мешало мне решить проблему. В классе OpenGLWidget я имел следующий код (среди остальных):

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

В качестве класса View был вызван перед инициализацией OpenGL и он всегда возвращается в 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() 

Надежда, которая поможет любому.