Python OpenGL зумирование
тут выпала задача сделать зум в opengl, я попробовал разобраться но всё тщетно, вот код, буду рад любым подсказкам, сам от себя пробовал много чего, и glScale и glOrtho, оно всё работает но отрисовывает один раз, я хочу повесить этот ивент на колесико мыши в PySide, но не получается, график просто не обновляется
from PySide2.QtCore import QPoint
from PySide2.QtWidgets import *
from OpenGL import GL
import sys
import numpy as np
# Simple example for a class derived from QWidget, which has its own resize methods and mouse events
class TestWidget(QOpenGLWidget):
def initializeGL(self):
self.vertices = vertices = np.array([0.0, 1.0, -1.0, -1.0, 1.0, -1.0], dtype=np.float32)
self.bufferID = bufferId = GL.glGenBuffers(1)
GL.glBindBuffer(GL.GL_ARRAY_BUFFER, bufferId)
GL.glBufferData(GL.GL_ARRAY_BUFFER, vertices.nbytes, vertices, GL.GL_DYNAMIC_DRAW)
GL.glEnableVertexAttribArray(0)
GL.glVertexAttribPointer(0, 2, GL.GL_FLOAT, GL.GL_FALSE, 0, None)
# GL.glOrtho(-10, 10, -10, 10, -10, 10) # если раскоментить тут - работает
# GL.glOrtho(-100, 100, -100, 100, -100, 100)
self.test = GL.glGetBufferSubData(GL.GL_ARRAY_BUFFER, 0, self.vertices.nbytes)
def paintGL(self):
GL.glDrawArrays(GL.GL_TRIANGLES, 0, 3)
def mousePressEvent(self, event):
GL.glRotatef(45, 0, 0, 1) # тут не работает
pos = QPoint(event.pos())
print(f"Clicked: {pos}")
event.accept()
def wheelEvent(self, event):
scrolls = event.delta()
print(f"Scrolled: {scrolls}")
GL.glOrtho(-100, 100, -100, 100, -100, 100) # тут не рабоатет
class TestContainerApp(QWidget):
def __init__(self):
QWidget.__init__(self)
self.setMinimumSize(500, 500)
self.setBaseSize(500, 500)
self.test_widget = TestWidget()
self.gridLayoutWidget = QWidget()
self.gridLayoutWidget.setObjectName(u"gridLayoutWidget")
self.gridLayout = QGridLayout(self.gridLayoutWidget)
self.gridLayout.setObjectName(u"gridLayout")
self.gridLayout.addWidget(self.test_widget, 0, 0)
self.setLayout(self.gridLayout)
self.test_widget.setEnabled(True)
self.test_widget.show()
if __name__ == '__main__':
app = QApplication()
my_app = TestContainerApp()
my_app.show()
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: antipups
→ Ссылка
В итоге сделал зуминг, с помощью комментария Владимира Клыкова, ответ вот такой:
Исправить Test Widget на тот виджет, который ниже:
class TestWidget(QOpenGLWidget):
def initializeGL(self):
self.vertices = vertices = np.array([0.0, 1.0, -1.0, -1.0, 1.0, -1.0], dtype=np.float32)
self.bufferID = bufferId = GL.glGenBuffers(1)
GL.glBindBuffer(GL.GL_ARRAY_BUFFER, bufferId)
GL.glBufferData(GL.GL_ARRAY_BUFFER, vertices.nbytes, vertices, GL.GL_DYNAMIC_DRAW)
GL.glEnableVertexAttribArray(0)
GL.glVertexAttribPointer(0, 2, GL.GL_FLOAT, GL.GL_FALSE, 0, None)
self.zooming_var = 0
self.old_zoom_var = 0
self.up_scale = 1.2
self.down_scale = 0.8
def set_scale(self):
if self.zooming_var < self.old_zoom_var:
scale = self.down_scale
elif self.zooming_var > self.old_zoom_var:
scale = self.up_scale
else:
scale = 1
self.old_zoom_var = self.zooming_var
return scale
def paintGL(self):
scale = self.set_scale()
GL.glScalef(*((scale, ) * 3))
GL.glDrawArrays(GL.GL_TRIANGLES, 0, 3)
def wheelEvent(self, event):
scrolls = event.delta()
if scrolls > 0:
self.zooming_var += 1
else:
self.zooming_var -= 1
self.update()