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

使用Python和wxPython的3D/4D图形?,python,graphics,wxpython,3d,vtk,Python,Graphics,Wxpython,3d,Vtk,在我博士生的日常工作中,我做地质建模。在我的业余时间(主要是为了好玩),我正在学习Python,并试图编写一个简单的程序来查看3D地理单元模型 geocellular模型只是一个3D网格,其中每个网格单元都有一些值(如右图所示)。因此,我希望我的查看器能够显示一个3D网格模型,如右侧的图片。同样,我希望它能够在x、y和z方向上显示模型的横截面(如左图所示) 我还希望模型能够围绕所有三个轴旋转并放大和缩小 我已经做了一些初步调查(主要是),看起来VisVis和VTK是两个潜在的选择。我正在尝试

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

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

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

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

问题:

  • 当我说我认为VisVis和VTK会为我想要的工作时,我说的对吗?一个比另一个好吗

  • 这两个选项中哪一个最容易实现

  • 还有另外一个选择,我也应该考虑?


    请记住,我对Python是新手,对wxPython也是新手。

    您正在寻找的是体素可视化、体素网格等。我会认真考虑(从来没有用过它,但我一直关注它),它似乎有非常接近的东西。 ,就像MayaVi一样构建在VTK之上,可能也是一个不错的选择


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

    vpython比mayavi更易于使用,但功能较少


    如果你想以一种更简单的方式进入VTK/MayaVi世界(参见eudoxos的完美答案),请查看它的API。这使matplotlib像基本的卷可视化一样,我还没有找到深入挖掘底层平台的需要。

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

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

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

    此外,为了让您开始学习,您可以在以下位置查看示例。如果它们还不够,您可以随时检查并将它们转换为Python。翻译并不困难,因为方法和属性的名称是相同的。如果您这样做了,我们鼓励您在wiki上添加示例。这本书中还有更多的例子

    当你学习VTK时,你会(再次)发现Ipython非常棒!让整个VTK名称空间触手可及会有很大帮助

    如果您需要更具体的帮助,邮件列表非常活跃。最后是关于VTK的,并且是免费的!不过,它们与Python无关


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

    就像使用Mayavi的
    mlab
    界面来完成这项工作的一个简单示例一样(甚至包括一些地质数据!):

    (数据和数据格式处理代码(geoprobe模块)可在此处找到:)


    虽然我同意从长远来看学习VTK会更好,但你可以用Mayavi很快地起床跑步。最大的优势是不必为了将数据转换为VTK格式而跳转。TVTK和Mayavi允许您直接使用numpy阵列。

    +1:我同意直接使用VTK更容易。这很难,但是MayaVi和VTK的所有挑战只是学习VTK,而MayaVi则是另一个障碍。后来,我发现开始使用MayaVi更容易,因为这简化了一些麻烦的事情(但不难概念化)。对于VTK文件的创建,可以使用PyEVTK。此外,手动创建lecagy VTK文件非常简单。您也可以使用MayaVi中的内置函数。我只是不想为了可视化而使用单独的文件格式。澄清:
    手工操作
    我指的是编程方式。
    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()