【发布时间】:2020-07-22 02:34:47
【问题描述】:
我想使用 pyqtgraph 和 OpenGL 在 3D 空间中的两个更新点之间形成一个形状。目前,我只发现可以将GLLinePlotItem 和GLMeshItem 与两点之间的顶点和平面连接起来。但是,我希望在点之间连接一个椭圆形或圆柱体形式,但我似乎无法找到一种方法来使用集成的 MeshData 球体和圆柱体,而不跳入复杂的数学、旋转矩阵和三角函数。
有没有更简单的方法,类似于 GLLinePlotItem 或 GLMeshItem?
说明我现在拥有什么,以及我想要拥有什么:
示例代码:
from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph as pg
import pyqtgraph.opengl as gl
import numpy as np
import sys
from PyQt5.QtCore import QTimer
from PyQt5.QtWidgets import QMainWindow, QApplication
from random import randint
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
w = gl.GLViewWidget()
w.show()
w.setCameraPosition(distance=15, azimuth=-90)
self.timer = QTimer()
self.timer.start(1000)
self.timer.timeout.connect(self.start)
g = gl.GLGridItem()
g.scale(2, 2, 1)
w.addItem(g)
self.md = gl.MeshData.sphere(rows=10, cols=20)
self.m1 = gl.GLMeshItem(meshdata=self.md,
smooth=True,
color=(1, 0, 0, 0.2),
shader="balloon",
glOptions="additive")
w.addItem(self.m1)
self.lineMesh = gl.GLLinePlotItem(width=1, antialias=False)
w.addItem(self.lineMesh)
def start(self):
# coordinates
point1 = np.array([randint(0,25), randint(0,25), 0])
point2 = np.array([randint(0,25), randint(0,25), 20])
line = np.array([point1, point2])
self.lineMesh.setData(pos=line)
length = (((point2[0] - point1[0]) ** 2 + (point2[1] - point1[1]) ** 2 + (
point2[2] - point1[2]) ** 2) ** 0.5)*0.5
center = (point1 + point2) / 2
#radius = np.linalg.norm(point2 - point1) / 2
self.md = gl.MeshData.sphere(rows=10, cols=20, radius=[1])
self.m1.setMeshData(meshdata=self.md)
self.m1.resetTransform()
self.m1.scale(1, 1, length)
self.m1.translate(*center)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MainWindow()
ex.show()
sys.exit(app.exec_())
【问题讨论】:
标签: python opengl pyqt pyqtgraph