如何使用OpenGL和Python通过(XYZ)坐标绘制折线

时间:2018-12-05 20:34:21

标签: python 3d pyqtgraph

我需要使用基于(X,Y,Z)坐标的OpenGl for Python绘制3D折线。代替numpy的行空间(类似这样):

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空间中直线的起点和终点。但是显然,它不起作用,如何以正确的伪代码描述的方式实现此目标?

example

1 个答案:

答案 0 :(得分:1)

我更改了坐标,因此您从一开始就可以看到这条线。 我还添加了import math import matplotlib.pyplot as plt from scipy.interpolate import make_interp_spline, BSpline import numpy as np Int = np.array([0,0,0,0,0,0,0.02,0.04,0.06,0,0,0.02,0.32,0.04,0,0,0.18,0.78, 0.76,0.2,0,0,0.3,0.3,0.1,0,0,0.04,0,0.06,0.0,0,0,0,0]) Angle = np.array([i for i in range(-85,90,5)]) x = Angle y = Int x_smooth=np.linspace(x.min(),x.max(),300) spl = make_interp_spline(x, y, k=3) y_smooth = spl(x_smooth) plt.plot(x_smooth,y_smooth) plt.xlabel("Angle") plt.ylabel("Intensity (mA)") plt.title("Intensity vs Angle") plt.grid(b=True, which='major', color='k', linestyle='-') plt.grid(b=True, which='minor', color='r', linestyle='-', alpha=0.2) plt.minorticks_on() plt.show() ,使其独立。

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)

要锁定位置,您应该继承GLViewWidget并重载 w.setCameraPosition(distance=10, elevation=42, azimuth=42) mouseMoveEvent。肮脏的方式是这样的:

wheelEvent

您定义一个空函数并将鼠标输入事件设置为该函数。