如何在 3D pyqtgraph 实现中设置 GLMeshItem 的绝对位置

Posted

技术标签:

【中文标题】如何在 3D pyqtgraph 实现中设置 GLMeshItem 的绝对位置【英文标题】:How to set absolute position of GLMeshItem in 3D pyqtgraph implementation 【发布时间】:2020-02-20 05:17:08 【问题描述】:

我正在为一些数据构建可视化工具,并希望使用在 pyqtgraphs 3D OpenGL 组件中绘制的 3D 球体来表示在提供的数据中识别的目标。

我能够生成球体并使用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】:

一个选项是通过resetTransform() 将项目的变换重置为identity 变换,然后再通过translate() 设置绝对位置。例如:

targetMI.resetTransform()
targetMI.translate(10, 0, 0)

【讨论】:

这样完美解决了问题,说得通。感谢您提供解决方案以及描述基础主体的链接。干杯!

以上是关于如何在 3D pyqtgraph 实现中设置 GLMeshItem 的绝对位置的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenGL 中设置 3D 空间的尺寸

在 PyQtGraph GraphicsWindow 中设置图像的对比度

GL_INVALID_OPERATION在computeShader中设置image2D

如何在 Ogre 3D 中设置计时器?

FLEX:如何在Flare3d中设置场景的背景颜色?

如何在Unity 3D中设置Google AdMod