Как нарисовать полилинию по (XYZ) координатам с использованием OpenGL и Python - PullRequest
0 голосов
/ 05 декабря 2018

Мне нужно нарисовать 3D-полилинию, используя OpenGl для Python на основе координат (X, Y, Z).Вместо пустого пространства линий (что-то вроде этого):

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)

Итак, здесь я показываю начальную и конечную точки для линии в трехмерном пространстве.Но очевидно, что это не работает, как реализовать это так, как это правильно описано в псевдокоде?

example

1 Ответ

0 голосов
/ 06 декабря 2018

Я изменил координаты, чтобы вы видели линию с самого начала.Я также добавил 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

Вы определяете пустую функцию и устанавливаете события ввода мыши для этой функции.

...