如何使用 OpenGL 和 Python 按 (XYZ) 坐标绘制折线
How to draw a polyline by (XYZ) coordinates using OpenGL and Python
我需要根据 (X,Y,Z) 坐标为 Python 使用 OpenGl 绘制 3D 折线。而不是 numpy linespace(像这样):
import pyqtgraph.opengl as gl
import numpy as np
w = gl.GLViewWidget()
y = np.linspace(1,3,3)
x = np.linspace(1,3,3)
pts = (x,y)
sh1 = gl.GLLinePlotItem(pos=pts, width=1, antialias=False)
w.addItem(sh1)
我想要一些更直接的东西,我可以将线坐标定义为线的实际坐标(起点和终点坐标)。
更像这样(伪代码):
import pyqtgraph.opengl as gl
import numpy as np
w = gl.GLViewWidget()
xx = 10
yx = 11
zx = 10
xy = 20
yy = 21
zy = 20
Xdot = (xx,yx,zx)
Ydot = (xy,yy,zy)
pts = (Xdot,Ydot)
sh1 = gl.GLLinePlotItem(pos=pts, width=1, antialias=False)
w.addItem(sh1)
所以,我在这里显示了 3D 线的起点和终点 space。但是显然,它不起作用,如何按照伪代码中描述的方式正确实现它?
我更改了坐标,以便您从头看到这条线。
我还添加了QApplication
,使其独立。
import pyqtgraph.opengl as gl
from pyqtgraph.Qt import QtWidgets
import numpy as np
import sys
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = gl.GLViewWidget()
xx = 0
yx = 0
zx = 0
xy = 1
yy = 0
zy = 0
Xdot = (xx, yx, zx)
Ydot = (xy, yy, zy)
pts = np.array([Xdot, Ydot])
sh1 = gl.GLLinePlotItem(pos=pts, width=1, antialias=False)
w.addItem(sh1)
w.show()
app.exec()
您可以通过
添加更多细分
Zdot = (1, 1, 1)
pts = np.array([Xdot, Ydot, Zdot])
设置中心(相机旋转的点):
from pyqtgraph import Vector
w.opts['center'] = Vector(0,0,10)
设置位置(相对于那个中心,仰角和方位角是度数的角度):
w.setCameraPosition(distance=10, elevation=42, azimuth=42)
要锁定位置,您应该从 GLViewWidget 继承并重载 mouseMoveEvent
和 wheelEvent
。肮脏的方式是这样的:
def empty(ev):
return None
w.mouseMoveEvent = empty
w.wheelEvent = empty
您定义了一个空函数并将您的鼠标输入事件设置为该函数。
我需要根据 (X,Y,Z) 坐标为 Python 使用 OpenGl 绘制 3D 折线。而不是 numpy linespace(像这样):
import pyqtgraph.opengl as gl
import numpy as np
w = gl.GLViewWidget()
y = np.linspace(1,3,3)
x = np.linspace(1,3,3)
pts = (x,y)
sh1 = gl.GLLinePlotItem(pos=pts, width=1, antialias=False)
w.addItem(sh1)
我想要一些更直接的东西,我可以将线坐标定义为线的实际坐标(起点和终点坐标)。 更像这样(伪代码):
import pyqtgraph.opengl as gl
import numpy as np
w = gl.GLViewWidget()
xx = 10
yx = 11
zx = 10
xy = 20
yy = 21
zy = 20
Xdot = (xx,yx,zx)
Ydot = (xy,yy,zy)
pts = (Xdot,Ydot)
sh1 = gl.GLLinePlotItem(pos=pts, width=1, antialias=False)
w.addItem(sh1)
所以,我在这里显示了 3D 线的起点和终点 space。但是显然,它不起作用,如何按照伪代码中描述的方式正确实现它?
我更改了坐标,以便您从头看到这条线。
我还添加了QApplication
,使其独立。
import pyqtgraph.opengl as gl
from pyqtgraph.Qt import QtWidgets
import numpy as np
import sys
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = gl.GLViewWidget()
xx = 0
yx = 0
zx = 0
xy = 1
yy = 0
zy = 0
Xdot = (xx, yx, zx)
Ydot = (xy, yy, zy)
pts = np.array([Xdot, Ydot])
sh1 = gl.GLLinePlotItem(pos=pts, width=1, antialias=False)
w.addItem(sh1)
w.show()
app.exec()
您可以通过
添加更多细分 Zdot = (1, 1, 1)
pts = np.array([Xdot, Ydot, Zdot])
设置中心(相机旋转的点):
from pyqtgraph import Vector
w.opts['center'] = Vector(0,0,10)
设置位置(相对于那个中心,仰角和方位角是度数的角度):
w.setCameraPosition(distance=10, elevation=42, azimuth=42)
要锁定位置,您应该从 GLViewWidget 继承并重载 mouseMoveEvent
和 wheelEvent
。肮脏的方式是这样的:
def empty(ev):
return None
w.mouseMoveEvent = empty
w.wheelEvent = empty
您定义了一个空函数并将您的鼠标输入事件设置为该函数。