首页 > 解决方案 > 如何使用OpenGL和Python通过(XYZ)坐标绘制折线

问题描述

我需要使用基于 (X,Y,Z) 坐标的 Python 的 OpenGl 绘制 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 空间中一条线的起点和终点。但显然,它不起作用,如何以伪代码中正确描述的方式实现这一点?

例子

标签: python3dpyqtgraph

解决方案


我改变了坐标,所以你从一开始就看到了这条线。我还添加了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 继承并重载mouseMoveEventwheelEvent. 肮脏的方式是这样的:

def empty(ev):
    return None
w.mouseMoveEvent = empty
w.wheelEvent = empty

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


推荐阅读