Mayavi: 前景对象顺序不正确(对象可见性错误)

创建于 2018-06-21  ·  27评论  ·  资料来源: enthought/mayavi

我远不精通 3D viz 并且不确定这是一个 mayavi 问题(如果我吠错了树,请道歉),但我观察到以下意外行为:

环境:

conda,anaconda 3,使用pip install mayavi vtk pyqt5而不是 conda 安装了 mayavi(在遇到与 #652 类似的问题之后)

Debian 4.9.88-1+deb9u1 (2018-05-07) x86_64 GNU/Linux
Name: mayavi
Version: 4.6.0
Name: vtk
Version: 8.1.0
Location: /home/xxxyyy/anaconda3/envs/ELA/lib/python3.6/site-packages

再现

# example from https://stackoverflow.com/a/10740780
from mayavi import mlab
import numpy as np

# Generate some random hypocenters
x, y, z, mag = np.random.random((4, 500))

# Make a curved well bore...
wellx, welly, wellz = 3 * [np.linspace(0, 1.5, 10)]
wellz =  wellz**2

# Plot the hypocenters, colored and scaled by magnitude
mlab.points3d(x, y, z, mag)

# Plot the wellbore
mlab.plot3d(wellx, welly, wellz, tube_radius=0.1)

mlab.show()

彩色球应围绕灰色管道,隐藏其下方的部分。
我确实在不同的 OS-Windows 上使用以前版本的 mayavi 获得了预期的行为(mayavi 版本 TBC,可能是 4.5)

incorrect_foreground

最有用的评论

在过去的几周里,我一直在使用 Python3 解决同样的问题(不正确的深度顺序渲染),我想我也会在这里分享我的经验(截至 2019 年 4 月 15 日)。

为了让我们在同一页面上,以下是我正在查看的版本:

  • 玛雅维:4.6.2
  • 特性:5.0.0
  • 特质:6.0.0
  • 视频:8.1.2
  • 设想:4.7.1
  • pyface:6.0.0
  • PyQt5:5.12.1
  • PyQt4: 4.11.4 (_from dpkg_)
  • PySide: 1.2.2 (_from dpkg_)
  • PySide2:5.12.2

Mayavi/VTK/traits 可以使用“wx”工具包或“qt4”工具包。 使用“qt4”工具包,可以进一步选择指定 QT API; 选项是“pyqt”、“pyqt5”、“pyside”和“pyside2”。 这些由环境变量 ETS_TOOLKIT(设置为 wx 或 qt4)和 QT_API(设置为 pyqt、pyqt5、pyside 或 pyside2;仅当 ETS_TOOLKIT 设置为 qt4 时适用)指定。

在 Mint 18.3(可能适用于任何 Ubuntu 16.04 变体)下,官方 Python3 是 3.5.2。 某些模块可通过 apt/dpkg 获得,但有些模块需要使用 pip 进行安装。 我无法为 Python3 安装 wxPython。 使用 Qt,结果各不相同:

  • ETS_TOOLKIT=qt4 和 QT_API=pyqt :正确呈现
  • ETS_TOOLKIT=qt4 和 QT_API=pyqt5 :以错误的顺序呈现
  • ETS_TOOLKIT=qt4 和 QT_API=pyside :正确呈现
  • ETS_TOOLKIT=qt4 和 QT_API=pyside2 :以错误的顺序呈现

对于 Mint 19.1(可能还有所有 Ubuntu 18.04 变体),结果是相似的。 Python3 版本为 3.6.7; 所有模块都和以前一样,除了在这里我可以用 pip3 安装 wxPython (4.0.1)。 在这种情况下,设置 ETS_TOOLKIT=wx 会给出正确的深度顺序。 至于 qt4 工具包,结果与 Mint 18.3 结果相同(即 pyqt 和 pyside 渲染正确;pyqt5 和 pyside2 没有)。

我尝试从源代码编译 PySide2 并且能够编译它; 然而,渲染仍然是错误的。

我还尝试使用 pyenv 来测试不同版本的 Python3(特别是 3.5.2 和 3.7.3)。 在这两种情况下,我都可以通过 pip3 安装必要的模块,除了官方 PySide 代码不支持高于 3.4 的 Python 版本。 PySide2 可用,PyQt5 也可用; 这些都不能正常工作。 我无法编译 wxPython。

说到这里,我在想是不是VTK的问题,而是QT的问题(我现在已经放弃wxPython了)。 但奇怪的是,在我的工作笔记本电脑(使用 Mint 18.3)上,使用 pyenv 我运行了 Python 3.7.3,在这种情况下,深度顺序正确呈现——使用 PyQt5 或 PySide2(而在我的家用笔记本电脑上, QT_API 给出了错误的深度顺序)。 那么有什么不同呢? 据我所知,唯一的区别是 OpenGL/GLX 驱动程序:我的家用笔记本电脑运行 SGI 驱动程序(据 glxinfo 报告),而我的工作笔记本电脑使用 NVIDIA 驱动程序。

最后,我还尝试使用 VirtualBox(带有 xfce 的 Mint 19.1)运行几个测试。 我仍在尝试不同的组合,但到目前为止结果是相同的。 (glxinfo 将 OpenGL/GLX 驱动程序报告为 SGI)。

所有27条评论

我似乎对放置在“地球”周围的 plot3d 点有同样的问题:

    sphere = mlab.points3d(0, 0, 0, scale_mode='none',
                           scale_factor=2,
                           # color=(0.67, 0.77, 0.93),
                           color=ocean_blue,
                           resolution=50,
                           opacity=.85,
                           name='Earth')
    #
    # These parameters, as well as the color, where tweaked through the GUI,
    # with the record mode to produce lines of code usable in a script.
    sphere.actor.property.specular = 0.45
    sphere.actor.property.specular_power = 5
    # Backface culling is necessary for more a beautiful transparent
    # rendering.
    sphere.actor.property.backface_culling = True

+1 用于 pyqt/pyside 后端,使用[email protected][email protected]在 Debian 拉伸上进行测试

这是 VTK 的一个普遍问题,之前在 #574 和 #491 中已经出现过。 我没有时间探索这个或找到解决方案。

@jmp75我遇到了同样的问题

@lhvalentini我在 Windows 10 上使用 Anaconda 2 (python 2.7.15) 和包 mayavi 4.5.0 和 vtk 6.3.0 进行这项工作。

伙计们,如果这是不透明度的问题,那就是另一个问题了。

我尝试了 OPs 代码,它对我来说工作正常。 如果这是特定于操作系统的问题,那么它可能是您的驱动程序的问题,因为它在我的 Mac OS 机器上绝对适合我的 VTK 8.1.1 和来自 master 的 Mayavi。 我怀疑 Mayavi 中是否有任何改变来解决这个问题。

@prabhuramachandran我会看看我是否可以进一步诊断以隔离(a)根本原因; 事实上,mayavi 不太可能是需要修复的地方,但如果我能指出一些有用的东西,我会在这个线程中报告。

我可以在 RHEL 7、PyQt5 和 Mayavi 4.6.2 上重现该问题(使用上面的彩色球示例)。 通过卸载 PyQt5 并安装 wxPython,我已经能够使其正常工作。 不幸的是,我需要 PyQt5。 在我使用的两台机器之一上,我可以在 VirtualGL 下运行它(仍然使用 RHEL 7、PyQt5 和 Mayavi 4.6.2),问题就消失了。 但是,在另一台机器(生产机器)上,VirtualGL 导致 Mayavi 崩溃。

关于如何在使用 PyQt5 时解决此问题的任何建议?

我在 PyQt5 中而不是在 wxPython 中重现了问题这一事实是否提供了任何线索?

我在 Linux Mint 18、64 位(Anaconda、Python 3.6、Qt 5.6.2、pyqt 5.6.0、VTK 8.1.1、Mayavi 4.6.2,从 conda-forge 安装)上有类似的问题。

如果我只运行 vanilla mlab.test_points3d()对象顺序是不正确的:

test
test2
我尝试尝试上述设置scene.renderer.use_depth_peelingf.scene.renderer.maximum_number_of_peels ,但没有成功。
任何想法可能是什么原因?

更新。 这个问题看起来像是 Linux 上的 Qt5 问题。 我可以在我的 ubuntu 机器上看到这个,但在 OS X 上看不到。不确定 Windows。 我没有看到它带有 Qt4 后端。 所以当我们使用 Qt5 和 QVTKRenderWindowInteractor 时,看起来渲染有点混乱。 我也向上游的 VTK 人员报告了这个问题。 我不确定是什么问题。

同样的问题在这里。 我搬回 Qt4,一切正常。

我在带有 Qt4 的 Linux 上遇到了这个问题(用 ipython 的 %gui qt4 激活)。 虽然可能是因为我有英特尔显卡(已知问题中已经提到了一些相关的东西)。

我也必须安装 Qt4; 在此之前以某种方式将“qt4”放在选项中并没有产生错误消息,而是使用了 Qt5。

好吧,我没有意识到 qt4 没有安装在我的一端(实际上, @ronceray ,它不会产生错误)...

PyQt 4.12.3 没有运行,但我能够让它与 4.12.1 版本一起工作。

比 PyQt5 慢得多,但它没有这个前景问题……让我免于设置另一张显卡!

我从 Fedora 27 -> Fedora 29 升级并安装了最新的 NVIDIA 图形驱动程序。 在此之后,mayavi 使用 pyqt5 按预期执行。

在过去的几周里,我一直在使用 Python3 解决同样的问题(不正确的深度顺序渲染),我想我也会在这里分享我的经验(截至 2019 年 4 月 15 日)。

为了让我们在同一页面上,以下是我正在查看的版本:

  • 玛雅维:4.6.2
  • 特性:5.0.0
  • 特质:6.0.0
  • 视频:8.1.2
  • 设想:4.7.1
  • pyface:6.0.0
  • PyQt5:5.12.1
  • PyQt4: 4.11.4 (_from dpkg_)
  • PySide: 1.2.2 (_from dpkg_)
  • PySide2:5.12.2

Mayavi/VTK/traits 可以使用“wx”工具包或“qt4”工具包。 使用“qt4”工具包,可以进一步选择指定 QT API; 选项是“pyqt”、“pyqt5”、“pyside”和“pyside2”。 这些由环境变量 ETS_TOOLKIT(设置为 wx 或 qt4)和 QT_API(设置为 pyqt、pyqt5、pyside 或 pyside2;仅当 ETS_TOOLKIT 设置为 qt4 时适用)指定。

在 Mint 18.3(可能适用于任何 Ubuntu 16.04 变体)下,官方 Python3 是 3.5.2。 某些模块可通过 apt/dpkg 获得,但有些模块需要使用 pip 进行安装。 我无法为 Python3 安装 wxPython。 使用 Qt,结果各不相同:

  • ETS_TOOLKIT=qt4 和 QT_API=pyqt :正确呈现
  • ETS_TOOLKIT=qt4 和 QT_API=pyqt5 :以错误的顺序呈现
  • ETS_TOOLKIT=qt4 和 QT_API=pyside :正确呈现
  • ETS_TOOLKIT=qt4 和 QT_API=pyside2 :以错误的顺序呈现

对于 Mint 19.1(可能还有所有 Ubuntu 18.04 变体),结果是相似的。 Python3 版本为 3.6.7; 所有模块都和以前一样,除了在这里我可以用 pip3 安装 wxPython (4.0.1)。 在这种情况下,设置 ETS_TOOLKIT=wx 会给出正确的深度顺序。 至于 qt4 工具包,结果与 Mint 18.3 结果相同(即 pyqt 和 pyside 渲染正确;pyqt5 和 pyside2 没有)。

我尝试从源代码编译 PySide2 并且能够编译它; 然而,渲染仍然是错误的。

我还尝试使用 pyenv 来测试不同版本的 Python3(特别是 3.5.2 和 3.7.3)。 在这两种情况下,我都可以通过 pip3 安装必要的模块,除了官方 PySide 代码不支持高于 3.4 的 Python 版本。 PySide2 可用,PyQt5 也可用; 这些都不能正常工作。 我无法编译 wxPython。

说到这里,我在想是不是VTK的问题,而是QT的问题(我现在已经放弃wxPython了)。 但奇怪的是,在我的工作笔记本电脑(使用 Mint 18.3)上,使用 pyenv 我运行了 Python 3.7.3,在这种情况下,深度顺序正确呈现——使用 PyQt5 或 PySide2(而在我的家用笔记本电脑上, QT_API 给出了错误的深度顺序)。 那么有什么不同呢? 据我所知,唯一的区别是 OpenGL/GLX 驱动程序:我的家用笔记本电脑运行 SGI 驱动程序(据 glxinfo 报告),而我的工作笔记本电脑使用 NVIDIA 驱动程序。

最后,我还尝试使用 VirtualBox(带有 xfce 的 Mint 19.1)运行几个测试。 我仍在尝试不同的组合,但到目前为止结果是相同的。 (glxinfo 将 OpenGL/GLX 驱动程序报告为 SGI)。

VTK ML 上的这个线程似乎提到了同样的问题。 不幸的是,它没有得到答复......

凭直觉,我在我的 Debian 笔记本电脑上尝试了一些值得报告的东西。 这是Debian wiki 中描述的 NVIDIA Optimus 笔记本电脑。 这些系统上基本上有两种显卡:NVIDIA 和 Intel。

小故事:所有其他事情都与我发布的原始测试脚本相同,在 Intel 卡上渲染不正确,但在 NVIDIA 硬件上正确渲染。

环境(相关包):

envisage                  4.7.2                    pypi_0    pypi
mayavi                    4.6.2                    pypi_0    pypi
pyface                    6.0.0                    pypi_0    pypi
pygments                  2.3.1                    pypi_0    pypi
pyqt5                     5.12.2                   pypi_0    pypi
pyqt5-sip                 4.19.17                  pypi_0    pypi
python                    3.6.8                h0371630_0  
traits                    5.1.1                    pypi_0    pypi
traitsui                  6.0.0                    pypi_0    pypi
vtk                       8.1.2                    pypi_0    pypi

有关如何使用optirun请参阅Debian wikioptirun python ~/src/tmp/qtbug.py工作正常。 为了说明有/没有optirun的区别,使用示例应用程序:

glxgears -info返回

GL_RENDERER   = Mesa DRI Intel(R) HD Graphics 630 (Kaby Lake GT2) 
GL_VERSION    = 3.0 Mesa 18.3.4
GL_VENDOR     = Intel Open Source Technology Center

optirun glxgears -info

GL_RENDERER   = Quadro M1200/PCIe/SSE2
GL_VERSION    = 4.6.0 NVIDIA 418.56
GL_VENDOR     = NVIDIA Corporation

再补充一点,在戴尔 Precision 5520 上的 Arch Linux 上,我看到问题在英特尔芯片上运行,但不是通过optirun使用 nvidia 卡。 这是通过 Arch 的官方存储库安装的 Python 3.7、Qt5 和 mayavi。

同样的问题,使用 PyQt5 后端运行 mayavi 会导致在 Debian Stretch 上使用 Mesa/SGI 驱动程序的渲染顺序不正确,但它适用于ETS_TOOLKIT=wx环境变量集。

我通过使用 wxPython 而不是 PyQt 解决了这个问题。

该线程在解决问题方面非常宝贵,非常感谢您的评论。

同样的问题,无法与 wx 一起使用,所以安装了 python-pyqt4,设置了ETS_TOOLKIT=qt4QT_API=pyqt ,这已经解决了。

我想为上述配置之一添加另一个确认。 我正在使用 Ubuntu 18.04 作为操作系统的 Linux 机器上工作。 我的系统有一个英特尔显卡。 我正在使用 anaconda3 为带电粒子的运动设置动画。 最终结果应该是一条螺旋线,一条线穿过它的中心。 对于带有 mayavi 4.6.2、vtk 8.1.2 和 pyqt 5.9.2 的 Python 3.6.8 环境,我得到如下信息:
snapshot
请注意,红线似乎在螺旋线之外,这是错误的。

为了解决这个问题,我在 anaconda3 中创建了一个新的 Python 3.5 环境并按以下顺序安装了软件包:

来自 conda-forge 的 pyqt 4.11.4
来自 pypi 的 vtk 8.1.2
来自 conda-forge 的 mayavi 4.6.2

并使用在我的 shell 中设置相关变量
出口 ETS_TOOLKIT=qt4
导出 QT_API=pyqt

并运行我的代码以获得正确的图表,如下所示
snapshot_right .
感谢上面所有想出它的聪明人。 干杯!

在今天早些时候重现问题(使用上面的彩色球示例)后,我能够在包含以下内容的 conda 环境中解决问题:

1)Python 3.8.5
2) VTK 9.0.1(使用 whl 文件安装)
3)pyqt5
4) Mayavi (4.7.3.dev0) 的最新“出血边缘”版本。

那么也许 VTK 9 解决了这个问题?

我可以确认带有 pyqt5 和 Mayavi 4.7.2(来自 conda-forge)的 VTK 9.0.1 解决了这个问题。

是的,我可以确认这个问题现在已经用 VTK-9.0.1 和最新的 Mayavi 解决了,尽管看起来 VTK 是修复的源头。 我在一台 Linux 机器上进行了测试,这台机器以前曾经失败过。 这很棒。 感谢您报告它。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

scottstanie picture scottstanie  ·  4评论

Kekushke picture Kekushke  ·  9评论

Make42 picture Make42  ·  7评论

dnacombo picture dnacombo  ·  7评论

rambalachandran picture rambalachandran  ·  9评论