【问题标题】:3D/4D graphics with Python and wxPython?使用 Python 和 wxPython 制作 3D/4D 图形?
【发布时间】:2011-12-03 10:15:37
【问题描述】:

在我作为博士生的日常工作中,我从事地质建模工作。在业余时间(主要是为了好玩),我正在学习 Python 并尝试编写一个简单的程序来查看 3D 地球细胞模型。

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

地球细胞模型只是一个 3D 网格,其中每个网格单元都有一些值(如右图所示)。所以,我希望我的查看器能够显示 3D 网格模型,如右侧图片。同样,我希望它能够显示模型在 x、y 和 z 方向上的横截面(如左图所示)。

我还希望模型能够围绕所有三个轴旋转并放大和缩小。

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

问题:

  1. 当我说我认为 VisVis 和 VTK 可以满足我的需求时,我说得对吗?一个比另一个更可取吗?

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

  3. 我还应该考虑其他选择吗?

请记住,我对 Python 很陌生,对 wxPython 也很陌生。

【问题讨论】:

    标签: python graphics wxpython 3d vtk


    【解决方案1】:

    你要找的是所谓的voxel可视化,voxel grid之类的。我会认真考虑MayaVi(从未使用过,但我一直在关注它),它似乎与here 非常接近。

    Paraview,像 MayaVi 一样构建在 VTK 之上,可能也是一个不错的选择。

    我认为直接使用 VTK 进行可视化很困难,它太低级,可能会让您感到沮丧。也就是说,您需要将数据保存为 VTK 数据集,以便在 MayaVi/Paraview 中打开;这并不难,你只需要选择正确的结构(vtkGrid,vtkUnstructedGrid,...)。

    【讨论】:

      【解决方案2】:

      就像一个使用 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 bitbucket.org/pauloh/pyevtk 。此外,手动创建遗留的 VTK 文件非常简单。
      • 您也可以只使用 mayavi 中的内置函数。我只是不想有一个单独的文件格式来进行可视化。
      • 澄清:by hand 我的意思是编程。
      【解决方案3】:

      就我而言,我选择直接使用 Python 的 VTK 绑定。老实说,我发现使用 VTK 比使用 Mayavi 更简单,部分原因是文档更好(很多例子!)。感觉 Mayavi 在我完成工作的过程中又增加了一层复杂性。但是tom10 是对的。开始之后,使用 Mayavi 可能会更容易。

      除此之外,Mayavi 提供了一个名为 TVTK 的库,它是 VTK 绑定的更 Pythonic 版本,但最后我选择了纯 VTK 以最小化依赖项的数量。但是你应该检查一下。也许这正是您正在寻找的。​​p>

      一开始我发现这个tutorial 很有帮助。它不是关于 Python,而是关于 tcl,但翻译示例很简单,它可以帮助您理解 vtk 的工作方式。

      此外,为了帮助您入门,您可以查看VTK Wiki 上的示例。如果它们还不够,您可以随时查看C++ examples 并将它们翻译成 Python。翻译并不难,因为方法和属性的名称是相同的。如果您这样做,我们鼓励您在 wiki 中添加示例。 source中还有更多例子。

      当您学习 VTK 时,您会(重新)发现 Ipython 很棒!让整个 VTK 命名空间触手可及有很大帮助。

      如果您需要更具体的帮助,vtk-users 邮件列表非常活跃。最后还有books 是关于VTK 的,some of them 是免费的!不过它们与Python 无关。

      我没有同时尝试过 wxPython 和 VTK,但那是因为我更喜欢 PyQt4 而不是 wxPython。 AFAIK 将 VTK 与任一库集成都没有问题。无论如何,在花时间编写 GUI 之前,请彻底检查 ParaView。它可能已经做了你想要的,如果没有,它也是python scriptable! (不过我从来没有检查过)。

      【讨论】:

      • +1:我同意直接到 VTK 更容易。这很困难,但使用 MayaVi 和 VTK 的所有挑战仅仅是了解 VTK,而对于 MayaVi,这是另一个障碍。后来,我发现开始使用 MayaVi 更容易,因为这简化了一些麻烦的事情(但并不难概念化)。
      【解决方案4】:

      如果您想要更轻松地进入 VTK/MayaVi 世界(请参阅 eudoxos 的最佳答案),请查看mlab API。这将类似于 matplotlib 的 convenience 引入了基本的体积可视化,我还没有发现需要深入挖掘底层平台。

      【讨论】:

        【解决方案5】:

        vpython 比 mayavi 使用起来更简单,但它的功能更少。

        http://vpython.org/contents/bounce_example.html

        【讨论】:

          猜你喜欢
          • 2018-03-13
          • 1970-01-01
          • 2011-01-18
          • 1970-01-01
          • 2021-09-27
          • 1970-01-01
          • 1970-01-01
          • 2016-08-17
          相关资源
          最近更新 更多