14

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

地质模型 http://img710.imageshack.us/img710/6503/sgems.png 地理模型2

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

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

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

问题:

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

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

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

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

4

5 回答 5

13

您正在寻找的是所谓的体素可视化、体素网格等。我会认真考虑MayaVi(从未使用过它,但我一直在关注它),它似乎在这里有一些非常接近的东西。

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

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

于 2011-10-08T08:23:20.357 回答
10

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

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

一开始我发现这个教程很有帮助。它不是关于 Python,而是关于 tcl,但翻译这些例子是微不足道的,它可以帮助你理解 vtk 的工作方式。

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

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

如果您需要更具体的帮助,vtk-users邮件列表非常活跃。最后还有一些关于 VTK的书籍,其中一些是免费的!虽然它们不是关于 Python 的。

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

于 2011-10-10T17:29:03.007 回答
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 数组。

于 2011-10-13T04:11:14.780 回答
3

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

于 2011-10-08T14:13:31.233 回答
1

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

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

于 2011-10-08T12:18:12.493 回答