如何在 QtOpenGL 中平移和缩放顶点线
How to pan and zoom vertex lines in QtOpenGL
我正在寻找一种通过 glVertex 移动一些线形式的方法,但到目前为止我还没有可靠的解决方案,这是我的代码。我试过移动 glOrtho,它不起作用,我厌倦了添加翻译,如果我不断地平移它就不起作用。而且我也不知道如何处理缩放,也许我应该创建一个相机并将其变成完整的 3D 场景?但是我找不到好的文档,所以我希望有人能给我一些启发,谢谢。
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
from PyQt4 import QtGui, QtCore
from PyQt4.QtOpenGL import *
class SampleWidget(QGLWidget):
xTranslationChanged = QtCore.pyqtSignal(int)
yTranslationChanged = QtCore.pyqtSignal(int)
def __init__(self, parent=None):
super(SampleWidget, self).__init__(parent)
self.xTrans = 0
self.yTrans = 0
self.w = 1600
self.h = 900
self.lastPos = QtCore.QPoint()
self.v_pos = [[50, 50], [75, 100], [100, 150], [200, 200], [300, 250], [400, 450]]
def paintGL(self):
glClear(GL_COLOR_BUFFER_BIT)
glBegin(GL_LINE_STRIP)
glColor3f(1.0, 0.0, 0.0)
for i, x in enumerate(self.v_pos):
if i < len(self.v_pos) - 1:
glVertex2i(self.v_pos[i][0], self.v_pos[i][1])
glVertex2i(self.v_pos[i + 1][0], self.v_pos[i + 1][1])
glEnd()
def resizeGL(self, w, h):
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(0, 1600, 0, 900, -1.0, 1.0)
#glViewport(0, 0, w, h)
def initializeGL(self):
glClearColor(0.0, 0.0, 0.0, 1.0)
glClear(GL_COLOR_BUFFER_BIT)
def mousePressEvent(self, event):
self.lastPos = event.pos()
def mouseMoveEvent(self, event):
dx = event.x() - self.lastPos.x()
dy = event.y() - self.lastPos.y()
# self.xTranslate(dx)
# self.yTranslate(dy)
glViewport(dx, dy, dx + 1600, dy + 900)
if event.buttons() & QtCore.Qt.RightButton:
pass
def xTranslate(self, dx):
self.xTrans = dx
self.xTranslationChanged.emit(dx)
self.updateGL()
def yTranslate(self, dy):
self.yTrans = -dy
self.yTranslationChanged.emit(dy)
self.updateGL()
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
widget = SampleWidget()
widget.show()
app.exec_()
那里应该有一个 glTranslate 可以将您正在渲染的线条移动到正确的位置。在调用 glTranslate.
之前,您应该将矩阵模式设置为 GL_MODELVIEW
您可以使用 glScale 进行缩放。
我正在寻找一种通过 glVertex 移动一些线形式的方法,但到目前为止我还没有可靠的解决方案,这是我的代码。我试过移动 glOrtho,它不起作用,我厌倦了添加翻译,如果我不断地平移它就不起作用。而且我也不知道如何处理缩放,也许我应该创建一个相机并将其变成完整的 3D 场景?但是我找不到好的文档,所以我希望有人能给我一些启发,谢谢。
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
from PyQt4 import QtGui, QtCore
from PyQt4.QtOpenGL import *
class SampleWidget(QGLWidget):
xTranslationChanged = QtCore.pyqtSignal(int)
yTranslationChanged = QtCore.pyqtSignal(int)
def __init__(self, parent=None):
super(SampleWidget, self).__init__(parent)
self.xTrans = 0
self.yTrans = 0
self.w = 1600
self.h = 900
self.lastPos = QtCore.QPoint()
self.v_pos = [[50, 50], [75, 100], [100, 150], [200, 200], [300, 250], [400, 450]]
def paintGL(self):
glClear(GL_COLOR_BUFFER_BIT)
glBegin(GL_LINE_STRIP)
glColor3f(1.0, 0.0, 0.0)
for i, x in enumerate(self.v_pos):
if i < len(self.v_pos) - 1:
glVertex2i(self.v_pos[i][0], self.v_pos[i][1])
glVertex2i(self.v_pos[i + 1][0], self.v_pos[i + 1][1])
glEnd()
def resizeGL(self, w, h):
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(0, 1600, 0, 900, -1.0, 1.0)
#glViewport(0, 0, w, h)
def initializeGL(self):
glClearColor(0.0, 0.0, 0.0, 1.0)
glClear(GL_COLOR_BUFFER_BIT)
def mousePressEvent(self, event):
self.lastPos = event.pos()
def mouseMoveEvent(self, event):
dx = event.x() - self.lastPos.x()
dy = event.y() - self.lastPos.y()
# self.xTranslate(dx)
# self.yTranslate(dy)
glViewport(dx, dy, dx + 1600, dy + 900)
if event.buttons() & QtCore.Qt.RightButton:
pass
def xTranslate(self, dx):
self.xTrans = dx
self.xTranslationChanged.emit(dx)
self.updateGL()
def yTranslate(self, dy):
self.yTrans = -dy
self.yTranslationChanged.emit(dy)
self.updateGL()
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
widget = SampleWidget()
widget.show()
app.exec_()
那里应该有一个 glTranslate 可以将您正在渲染的线条移动到正确的位置。在调用 glTranslate.
之前,您应该将矩阵模式设置为 GL_MODELVIEW您可以使用 glScale 进行缩放。