Как установить абсолютную позицию GLMeshItem в реализации 3D pyqtgraph - PullRequest
0 голосов
/ 24 октября 2019

Я создаю визуализатор для некоторых данных и хочу использовать трехмерные сферы, нанесенные в pyqtgraphs 3D OpenGL, для представления целей, определенных в предоставленных данных.

Я могу генерировать сферы и перемещать их с помощью команд GLMeshItem.translate(), однако я не могу найти удобный способ установки координат сферы без предварительного получения текущей позиции указанных сфер посредством вызова. в .transform (), а затем сгенерировать команду перевода из текущей позиции в новые абсолютные координаты, в которые я бы хотел переместить. Возможно, это единственный способ сделать это, я просто подозреваю, что есть более прямой набор абсолютных координат элементов сетки, которые я просто не могу определить.

В следующем коде показана базовая структураза то, что я делаю, а также текущий метод, который я использую для перемещения сферы.


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

app = QtGui.QApplication([])
w = gl.GLViewWidget()
w.showMaximized()
w.setWindowTitle('pyqtgraph example: GLMeshItem')
w.setCameraPosition(distance=40)

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

verts = np.array([
    [0, 0, 0],
    [2, 0, 0],
    [1, 2, 0],
    [1, 1, 1],
])
faces = np.array([
    [0, 1, 2],
    [0, 1, 3],
    [0, 2, 3],
    [1, 2, 3]
])
colors = np.array([
    [1, 0, 0, 0.3],
    [0, 1, 0, 0.3],
    [0, 0, 1, 0.3],
    [1, 1, 0, 0.3]
])


md = gl.MeshData.sphere(rows=4, cols=4)

colors = np.ones((md.faceCount(), 4), dtype=float)
colors[::2,0] = 0
colors[:,1] = np.linspace(0, 1, colors.shape[0])
md.setFaceColors(colors)
m3 = gl.GLMeshItem(meshdata=md, smooth=False)#, shader='balloon')
w.addItem(m3)

target = gl.MeshData.sphere(4,4,10)
targetMI = gl.GLMeshItem(meshdata = target, drawFaces = True,smooth = False)
w.addItem(targetMI)
while(1):
    targetMI.translate(0.1,0,0)
    app.processEvents()



## Start Qt event loop unless running in interactive mode.
if __name__ == '__main__':
    import sys
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()

Как видно из этого примера. translate отлично работает для перемещения относительно текущей позиции. Мне просто любопытно, существует ли метод для перемещения по абсолютной позиции на GLMeshItem (в данном случае targetMI), чтобы я мог переместить его в координату, не получая сначала преобразование, а затем вычисляяперевод необходим для перемещения к нужным координатам.

1 Ответ

0 голосов
/ 24 октября 2019

Можно сбросить преобразование элемента до преобразования тождество с помощью resetTransform(), прежде чем установить абсолютную позицию с помощью translate(). например:

targetMI.resetTransform()
targetMI.translate(10, 0, 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...