使用Python和wxPython的3D/4D图形?

2024-06-28 10:28:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

geocellular模型只是一个三维网格,其中每个网格单元都有一些值(如右图所示)。所以,我希望我的观众能够显示一个三维网格模型,就像图片的右侧。同时,我希望它能够显示x,y和z方向上的横截面(如左图所示)。在

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

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

问题:

  1. 当我说我认为visvisvis和VTK能满足我的要求时,我是对的吗?一个比另一个好吗?

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

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

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


Tags: 模型程序http网格model选项wxpython建模
3条回答

你要找的是所谓的体素可视化,体素网格等等。我会认真考虑MayaVi(从未使用过它,但我一直关注它),它似乎与{a2}非常接近。在

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

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

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

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

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

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

当你在学习VTK的时候,你会发现Ipython很棒!将整个VTK名称空间放在指尖上会有很大的帮助。在

如果您需要更具体的帮助,vtk-users邮件列表非常活跃。最后是关于VTK的books,并且some of them是免费的!但他们不是关于Python的。在

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

就像一个使用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阵列。在

相关问题 更多 >