PyQtGraph & OpenGL: как создать сферу между двумя координатами? - PullRequest
0 голосов
/ 07 апреля 2020

Можно ли создать сферу между двумя координатами, используя PyQtGraph и OpenGL? В моем примере кода я сделал сферу, но положение и размер определяются только «строками» и «столбцами». Я хотел бы соединить конечные точки сферы между точкой 1 и точкой 2. Вы можете мне помочь?

enter image description here

from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph as pg
import pyqtgraph.opengl as gl
import numpy as np
import sys

app = QtGui.QApplication([])
w = gl.GLViewWidget()
w.show()
w.setCameraPosition(distance=15, azimuth=-90)

g = gl.GLGridItem()
g.scale(2, 2, 1)
w.addItem(g)

# coordinates
point1 = np.array([0, 0, 0])
point2 = np.array([0, 5, 0])

md = gl.MeshData.sphere(rows=10, cols=20)

m1 = gl.GLMeshItem(meshdata=md, smooth=True, color=(1, 0, 0, 0.2), shader='balloon', glOptions='additive')
m1.scale(1, 1, 2)
w.addItem(m1)


if __name__ == '__main__':

    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()

1 Ответ

1 голос
/ 07 апреля 2020

Метод сфера () возвращает данные, связанные со сферой определенного радиуса (по умолчанию 1) и центрированные на (0, 0, 0), поэтому, используя информацию о точках 1 и 2, вы можете получить радиус и center, чтобы установить sh центр должен переместить элемент, используя метод translate ():

from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph as pg
import pyqtgraph.opengl as gl
import numpy as np
import sys

app = QtGui.QApplication([])
w = gl.GLViewWidget()
w.show()
w.setCameraPosition(distance=15, azimuth=-90)

g = gl.GLGridItem()
w.addItem(g)

# coordinates
point1 = np.array([0, 0, 0])
point2 = np.array([0, 5, 0])

center = (point1 + point2) / 2
radius = np.linalg.norm(point2 - point1) / 2

md = gl.MeshData.sphere(rows=10, cols=20, radius=radius)

m1 = gl.GLMeshItem(
    meshdata=md,
    smooth=True,
    color=(1, 0, 0, 0.2),
    shader="balloon",
    glOptions="additive",
)
m1.translate(*center)

w.addItem(m1)



if __name__ == "__main__":

    if (sys.flags.interactive != 1) or not hasattr(QtCore, "PYQT_VERSION"):
        QtGui.QApplication.instance().exec_()
...