Получите openGLwidget, связанный с обновлением Qtimer - PullRequest
1 голос
/ 24 апреля 2020

Я пытаюсь построить gui с Pyqt5. и вместе с gui есть openGLwidget, который должен содержать вращающийся куб. Но я не могу понять, как заставить куб вращаться. Спасибо. это функция настройки

def setupUI(self):
    self.openGLWidget.initializeGL()
    self.openGLWidget.resizeGL(651,551)
    self.openGLWidget.paintGL = self.paintGL
    self.rotX=10.0
    self.rotY=0.0
    self.rotZ=0.0
    timer = QTimer(self)
    timer.timeout.connect(self.Update) 
    timer.start(1000)

, а вот функции paintGL и обновления:

def paintGL(self):
    glClear(GL_COLOR_BUFFER_BIT)
    glColor3f(0,1,0)
    self.Cube()
    gluPerspective(45, 651/551, 1, 100.0)
    glTranslatef(0.0,0.0, -5)
    glRotate(self.rotX, 1.0, 0.0, 0.0)
def Update(self):
    glClear(GL_COLOR_BUFFER_BIT)
    self.rotX+=10
    self.openGLWidget.paintGL = self.paintGL

1 Ответ

2 голосов
/ 24 апреля 2020

Существуют разные текущие матрицы, см. glMatrixMode. Матрица проекции должна быть установлена ​​на текущий GL_PROJECTION, а матрица вида модели - на GL_MODELVIEW.
Операции, которые манипулируют текущей матрицей (например, gluPerspective, glTranslate , glRotate), не просто установить матрицу, они задают матрицу и умножают текущую матрицу на новую матрицу. Таким образом, вы должны установить Identity matrix в начале каждого кадра, с помощью glLoadIdentity:

def paintGL(self):
    glClear(GL_COLOR_BUFFER_BIT)
    glColor3f(0,1,0)

    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(45, 651/551, 1, 100.0)

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    glTranslatef(0, 0, -7)
    glRotate(self.rotX, 1, 0, 0)
    self.Cube()

Invoke update(), чтобы обновить или перекрасить соответственно QOpenGLWidget:

timer = QTimer(self)
timer.timeout.connect(self.Update) 
timer.start(10)
def Update(self):
    self.rotX += 1
    self.openGLWidget.update()

...