2011-10-08 51 views
14

在我作为博士生的日常工作中,我做了地质建模。在业余时间(主要是为了好玩),我正在学习Python并试图编写一个简单的程序来查看3D地理细胞模型。使用Python和wxPython的3D/4D图形?

geological model http://img710.imageshack.us/img710/6503/sgems.png geo model2 http://img638.imageshack.us/img638/529/1sblockmodel.jpg

的地质细胞模型仅仅是一个三维网格,其中每个网格单元具有一定的值(如在右图所示)。所以,我希望我的观众能够显示一个3D网格模型,就像右边的图片一样。另外,我希望它能够在x,y和z方向上显示模型的横截面(如左图所示)。

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

我已经做了一些初步调查(主要是here),好像VisVis和VTK是两种潜在的选择。我正在尝试为主GUI使用wxPython,就我所知,它看起来像这两个选项都可以用于wxPython。

问题:

  1. 我说得对,当我说我想VisVis和VTK会为我想要什么工作?一个比另一个更好吗?

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

  3. 我还应该考虑另一种选择吗?

请记住,我对Python新手,对wxPython很新。

回答

13

你在找什么叫做体素可视化,体素网格或这样的。我会认真考虑MayaVi(从来没有用过,但我一直盯着它),它似乎有一些非常接近here

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

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

3

如果你想进入的VTK/Mayavi的世界(见eudoxos'精答案)更简单的方法,看看mlab API给它。这带来了类似matplotlib的convenience的基本体积可视化,我还没有找到需要深入挖掘底层平台。

+0

mlab URL /链接损坏 – DevPlayer

10

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

除此之外,Mayavi提供了一个名为TVTK的库,它是VTK绑定的pythonic版本,但最终我选择了纯VTK以减少依赖关系的数量。但你应该检查出来。也许这只是你正在寻找的东西。

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

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

当你正在学习VTK时,你会(重新)发现Ipython真棒!让整个VTK命名空间触手可及。

如果您需要更具体的帮助,vtk-users邮件列表是相当活跃。最后有关于VTK的bookssome of them是免费的!它们不是关于Python的。

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

+3

+1:我同意直接对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() 

enter image description here (数据和数据格式处理代码(geoprobe模块)可在此处获得:http://code.google.com/p/python-geoprobe/

虽然我同意从长远来看学习VTK更好,但您可以使用Mayavi快速启动并运行。最大的好处是不需要花费大量时间将数据转换为VTK格式。 TVTK和Mayavi允许你直接使用numpy数组。

+0

要创建VTK文件,您可以使用PyEVTK https://bitbucket.org/pauloh/pyevtk。另外,手动创建lecagy VTK文件非常简单。 – pmav99

+0

您也可以使用mayavi中的内置函数。我只是不希望有一个单独的文件格式的可视化。 –

+0

澄清:'手''我的意思是编程。 – pmav99