PyQtGraph - 在3d视图中关闭透视

时间:2016-01-14 22:49:22

标签: python-3.x opengl pyqtgraph

我正在使用PyQtGraph绘制网格曲面。我希望看到关闭透视的3D世界。

这在pyQtGraph中是否可行?我搜索了文档和谷歌组,但找不到任何参考。我认为原则上可以使用openGL,所以有没有办法在pyQtGraph中打开/关闭这个和控制透视图?

4 个答案:

答案 0 :(得分:2)

确定。这是代码。

from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph.opengl as gl
app = QtGui.QApplication([])
w = gl.GLViewWidget()
w.setBackgroundColor('k')

# Switch to 'nearly' orthographic projection.
w.opts['distance'] = 2000
w.opts['fov'] = 1

# set-up title grid etc...
w.setWindowTitle('pyqtgraph example')
g = gl.GLGridItem(color='w')
w.addItem(g)

# insert draw commands here.

w.show()

## Start Qt event loop
QtGui.QApplication.instance().exec_()

答案 1 :(得分:0)

对文档进行粗略检查没有任何帮助......但是如果在减小视野(FOV)的同时增加距离,则可以在改变这两个参数时将正交投影逼近任意精度

答案 2 :(得分:0)

我建议尝试更新的vispy;它在支持的相机类型和鼠标交互方面更加灵活。特别是,正交投影恰好是'arcball'相机类型的默认设置,也可能是其他类型的默认设置;通过将camera.fov设置为0来设置它。

作为奖励,ipython的人体工程学也得到了很大改善,即你的ipython shell在场景活动的同时保持响应,你可以杀死场景而不杀死你的ipython实例,然后启动另一个。

答案 3 :(得分:0)

已经有一段时间了,但我最近也在寻找同样的东西,想给出一个不同的解决方案。

PyQtGraph 不直接公开这一点,但可以通过继承 GLViewWidget 并覆盖 projectionMatrix 方法来实现(参见 GLViewWidget sourceqt docs for QMatrix4x4)。 例如,以下将投影默认设置为“ortho”,并提供切换到透视(视锥体)投影的选项:

def projectionMatrix(self, region=None, projection='ortho'):
    assert projection in ['ortho', 'frustum']
    if region is None:
        dpr = self.devicePixelRatio()
        region = (0, 0, self.width() * dpr, self.height() * dpr)

    x0, y0, w, h = self.getViewport()
    dist = self.opts['distance']
    fov = self.opts['fov']
    nearClip = dist * 0.001
    farClip = dist * 1000.

    r = nearClip * np.tan(fov * 0.5 * np.pi / 180.)
    t = r * h / w

    ## Note that X0 and width in these equations must be the values used in viewport
    left = r * ((region[0] - x0) * (2.0 / w) - 1)
    right = r * ((region[0] + region[2] - x0) * (2.0 / w) - 1)
    bottom = t * ((region[1] - y0) * (2.0 / h) - 1)
    top = t * ((region[1] + region[3] - y0) * (2.0 / h) - 1)

    tr = QtGui.QMatrix4x4()
    if projection == 'ortho':
        tr.ortho(left, right, bottom, top, nearClip, farClip)
    elif projection == 'frustum':
        tr.frustum(left, right, bottom, top, nearClip, farClip)
    return tr