Python和wxPython如何实现3D/4D图形?

14

作为一名博士研究生,我在我的工作中进行地质建模。在业余时间里(主要是出于兴趣),我正在学习Python,并尝试编写一个简单的程序来查看三维地质细胞模型。

geological model http://img710.imageshack.us/img710/6503/sgems.png geo model2

地质细胞模型只是一个三维网格,每个网格单元都有一些值(如右图所示)。因此,我希望我的查看器能够像右侧图片那样显示三维网格模型。此外,我希望它能够在x、y和z方向上显示模型的剖面(如左图所示)。

我还希望这些模型能够围绕三个轴旋转并进行缩放。

我已经做了一些初步的调查(主要是这里),似乎VisVis和VTK是两个潜在的选择。我正在尝试使用wxPython作为主GUI,就我所知,这两个选项都可以与wxPython一起使用。

问题:

  1. 我说VisVis和VTK会对我想要的工作有用,这样说是正确的吗?其中一个更可取吗?

  2. 这两个选项中哪一个最容易实现?

  3. 还有另一个选项应该考虑吗?

请记住,我对Python还比较新,对wxPython更是全新。

5个回答

13
您寻找的是称为体素可视化、体素网格等相关内容。我强烈建议考虑使用MayaVi(虽然我没有使用过,但一直在关注),它似乎有非常接近的功能,此处有相关信息。 Paraview也是一个不错的选择,它和MayaVi一样都是基于VTK构建的。
我认为直接使用VTK进行可视化很困难,它太底层了,可能会让您感到沮丧。尽管如此,您仍需要将数据以VTK数据集的形式保存,并在MayaVi/Paraview中打开;这并不难,您只需选择正确的结构(vtkGrid、vtkUnstructedGrid等)。

10
在我的情况下,我选择直接使用Python的VTK绑定。老实说,我发现使用VTK比Mayavi更简单,部分原因是文档更好(有很多示例!)。感觉Mayavi在完成任务的路上增加了另一层复杂性。但是tom10是正确的。在你开始之后,使用Mayavi可能会更容易。
除此之外,Mayavi提供了一个名为TVTK的库,它是VTK绑定的更pythonic版本,但最终我选择了纯VTK以最小化依赖关系的数量。但你应该去看看它。也许它正是你正在寻找的东西。
起初,我发现这个教程非常有用。它不是关于Python的,而是关于tcl的,但翻译示例很容易,它可以帮助你理解vtk的工作方式。
此外,为了让你开始,你可以查看VTK Wiki中的示例。如果不够用,你可以随时检查C++示例并将它们翻译成Python。翻译并不难,因为方法和属性的名称是相同的。如果你这样做,我们鼓励你将示例添加到Wiki中。在源代码中还有更多示例。
当你学习VTK时,你会(重新)发现Ipython很棒!拥有整个VTK命名空间可以极大地帮助你。
如果你需要更具体的帮助,vtk-users邮件列表非常活跃。最后,关于VTK还有一些书籍,其中一些是免费的!尽管它们不是关于Python的。

我没有尝试过将wxPython和VTK一起使用,但这是因为我更喜欢PyQt4而不是wxPython。据我所知,VTK与这两个库的集成都没有问题。无论如何,在花费时间编写GUI之前,请彻底检查ParaView。它可能已经实现了您想要的功能,如果没有,它也是可通过python脚本控制的!(虽然我从未检查过)。


3
我同意直接使用VTK更容易。学习MayaVi和VTK的所有挑战都在于了解VTK,而MayaVi则是另一个障碍。后来,我发现开始使用MayaVi更容易,因为它简化了一些麻烦的问题(但概念上并不难)。 - tom10

7

这里有一个使用Mayavi的mlab接口进行操作的简单例子(甚至是一些地质数据):

from mayavi import mlab
import geoprobe

vol = geoprobe.volume('Volumes/example.vol')
data = vol.load()  #"data" here is just a 3D numpy array of uint8's

fig = mlab.figure(bgcolor=(1., 1., 1.), fgcolor=(0., 0., 0.), size=(800,800))
grid = mlab.pipeline.scalar_field(data)

# Have things display in kilometers with no vertical exxageration
# Each voxel actually represents a 12.5 by 18.5 by 5 meter volume.
grid.spacing = [vol.dxW / 1000, vol.dyW / 1000, vol.dz / 1000]

# Now, let's display a few cut planes. These are interactive, and are set up to 
# be dragged around through the volume. If you'd prefer non-interactive cut 
# planes, have a look at mlab.pipeline.scalar_cut_plane instead.
orientations = ['x', 'x', 'y', 'z']
starting_positions = [vol.nx//4, 3*vol.nx//4, vol.ny//2, vol.nz]
for orientation, start_pos in zip(orientations, starting_positions):
    plane = mlab.pipeline.image_plane_widget(grid, colormap='gray',
            plane_orientation='%s_axes' % orientation, slice_index=start_pos)

    # High values should be black, low values should be white...
    plane.module_manager.scalar_lut_manager.reverse_lut = True

mlab.show()

这里输入图片描述 (数据和数据格式处理代码(geoprobe模块)可在此处获取:http://code.google.com/p/python-geoprobe/

虽然我同意学习 VTK 对长远来说更好,但你可以通过 Mayavi 快速上手。其最大优势是无需费力地将数据转换为 VTK 格式。TVTK 和 Mayavi 允许您直接使用 numpy 数组。


创建VTK文件,您可以使用PyEVTK https://bitbucket.org/pauloh/pyevtk。此外,手动创建旧版VTK文件非常简单。 - pmav99
您也可以直接使用Mayavi中的内置函数。我只是更喜欢不必为可视化单独创建文件格式。 - Joe Kington
澄清:by hand 指的是以编程方式。 - pmav99

3
如果你想更轻松地进入VTK/MayaVi的世界(参见eudoxos的精彩答案),可以看看它的mlab API。这将为基本体积可视化带来类似于matplotlib的便利,我还没有找到深入研究底层平台的必要性。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接