3D / 4D графика с Python и wxPython? - PullRequest
14 голосов
/ 08 октября 2011

В своей работе аспирантом я занимаюсь геологическим моделированием. В свободное время (в основном для развлечения) я изучаю Python и пытаюсь написать простую программу для просмотра трехмерных геоклеточных моделей.

геологическая модель http://img710.imageshack.us/img710/6503/sgems.png гео модель2 http://img638.imageshack.us/img638/529/1sblockmodel.jpg

Гео-клеточная модель - это просто трехмерная сетка, где каждая ячейка сетки имеет определенное значение (как показано на правом рисунке). Итак, я бы хотел, чтобы мой зритель мог отображать трехмерную сеточную модель, как на картинке справа. Кроме того, я хотел бы, чтобы он мог отображать поперечные сечения модели в направлениях x, y и z (это показано на левом рисунке).

Я также хотел бы, чтобы модели могли вращаться вокруг всех трех осей и увеличивать и уменьшать масштаб.

Я провел предварительное расследование (в основном здесь ), и кажется, что VisVis и VTK - это два возможных варианта. Я пытаюсь использовать wxPython для основного графического интерфейса, и, насколько я могу судить, оба варианта будут работать с wxPython.

Вопросы:

  1. Прав ли я, когда говорю, что VisVis и VTK будут работать для того, что я хочу? Один предпочтительнее другого?

  2. Какой из этих двух вариантов будет проще всего реализовать?

  3. Есть ли другой вариант, который я тоже должен рассмотреть?

Имейте в виду, что я новичок в Python и очень плохо знаком с wxPython.

Ответы [ 5 ]

13 голосов
/ 08 октября 2011

То, что вы ищете, называется воксел визуализация, воксельная сетка или что-то подобное. Я бы серьезно рассмотрел MayaVi (никогда не использовал его, но я следил за этим), кажется, что-то очень близко здесь .

Paraview , построенный на базе VTK, как и MayaVi, также может быть хорошим вариантом.

Я думаю, что перейти к VTK для визуализации сложно, он слишком низкоуровневый и, вероятно, разочарует вас. Тем не менее, вы захотите сохранить ваши данные в виде наборов данных VTK для открытия в MayaVi / Paraview; это не сложно, вам просто нужно выбрать правильную структуру (vtkGrid, vtkUnstructedGrid, ...).

10 голосов
/ 10 октября 2011

В моем случае я выбрал непосредственное использование привязок VTK для Python. Честно говоря, мне показалось, что работать с VTK проще, чем с Mayavi, отчасти потому, что документация лучше (много примеров!). Мне казалось, что Mayavi добавляет еще один уровень сложности на моем пути, чтобы выполнить работу. Но tom10 правильно. После того, как вы начали, использование Mayavi может быть проще.

Кроме того, Mayavi предлагает библиотеку под названием TVTK , которая является более питонной версией привязок VTK, но в итоге я выбрал простой VTK, чтобы минимизировать количество зависимостей. Но вы должны проверить это. Возможно, это будет именно то, что вы ищете.

В начале я нашел очень полезным этот учебник . Речь идет не о Python, а о tcl, но перевод примеров является тривиальным и помогает понять, как работает vtk.

Кроме того, чтобы начать работу, вы можете проверить примеры в VTK Wiki . Если их недостаточно, вы всегда можете проверить примеры C ++ и перевести их на Python. Перевод не сложен, так как названия методов и свойств совпадают. Если вы это сделаете, вы можете добавить примеры в вики. В источнике есть еще больше примеров .

Пока вы изучаете VTK, вы (вновь) обнаружите, что Ipython потрясающий! Наличие всего пространства имен VTK на кончиках ваших пальцев очень помогает.

Если вам нужна более конкретная помощь, список рассылки vtk-users достаточно активен. Наконец, есть книги о ВТК, и некоторые из них бесплатны! Они не о Python, хотя.

Я не пробовал wxPython и VTK вместе, но это потому, что я предпочитаю PyQt4, а не wxPython. AFAIK нет проблем с интеграцией ВТК с любой библиотекой. В любом случае, прежде чем тратить время на написание графического интерфейса, внимательно ознакомьтесь с ParaView. Вероятно, он уже делает то, что вы хотите, а если нет, то он также с поддержкой Python ! (Я никогда не проверял это все же).

7 голосов
/ 13 октября 2011

Просто в качестве простого примера использования интерфейса 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.

3 голосов
/ 08 октября 2011

Если вам нужен более простой способ проникнуть в мир VTK / MayaVi (см. Точный ответ eudoxos), посмотрите на него API mlab . Это приносит matplotlib-подобный удобство к базовым визуализациям тома, и мне еще предстоит найти необходимость углубиться в основную платформу.

1 голос
/ 08 октября 2011

vpython проще в использовании, чем Mayavi, но у него меньше возможностей.

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

...