2011-10-08 50 views
14

En mi trabajo diario como estudiante de doctorado, hago modelaje geológico. En mi tiempo libre (principalmente por diversión), estoy aprendiendo Python y tratando de escribir un programa simple para ver modelos geocelulares en 3D.Gráficos 3D/4D con Python y wxPython?

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

El modelo geocelular es sólo una rejilla 3D donde cada celda de la cuadrícula tiene algún valor (como se muestra en la figura de la derecha). Por lo tanto, me gustaría que mi espectador pudiera mostrar un modelo de cuadrícula 3D como la imagen del lado derecho. Además, me gustaría que pueda mostrar secciones transversales a través del modelo en las direcciones x, y y z (esto se muestra en la figura de la izquierda).

También me gustaría que los modelos puedan rotar alrededor de los tres ejes y acercar y alejar.

He realizado algunas investigaciones preliminares (principalmente here) y parece que VisVis y VTK son dos posibles opciones. Estoy tratando de usar wxPython para la GUI principal y parece que ambas opciones funcionarán con wxPython por lo que yo sé.

Preguntas:

  1. Estoy en lo cierto cuando digo que creo VisVis y VTK trabajarían para lo que quiero? ¿Es preferible uno al otro?

  2. ¿Cuál de estas dos opciones sería la más fácil de implementar?

  3. ¿Hay alguna otra opción que también deba considerar?

Tenga en cuenta que soy nuevo en Python y muy nuevo en wxPython.

Respuesta

13

Lo que usted está buscando se llama voxel visualización, rejilla voxel o algo así. Consideraría seriamente MayaVi (nunca lo usé, pero lo sigo), parece tener algo muy cerca here.

Paraview, construido encima de VTK al igual que MayaVi, podría ser una buena opción, también.

Creo que ir directamente a VTK para la visualización es difícil, es de muy bajo nivel y probablemente lo haga sentir frustrado. Dicho esto, querrá guardar sus datos en forma de conjuntos de datos VTK para abrirlos en MayaVi/Paraview; no es difícil, solo tienes que elegir la estructura correcta (vtkGrid, vtkUnstructedGrid, ...).

3

Si quieres una manera más fácil de conseguir en el mundo VTK/MayaVi (ver fina respuesta Eudoxos'), mira el mlab API a ella. Esto trae matplantlib-like convenience a las visualizaciones de volumen básico y todavía tengo que encontrar la necesidad de profundizar en la plataforma subyacente.

+0

mlab URL/link broken – DevPlayer

10

En mi caso, elegí usar directamente los enlaces VTK para Python. Para ser sincero, me resultó más sencillo seguir VTK que Mayavi, en parte porque la documentación es mejor (¡muchos ejemplos!).Parecía que Mayavi estaba agregando otra capa de complejidad en mi camino para hacer el trabajo. Pero tom10 tiene razón. Después de comenzar, usar Mayavi puede ser más fácil.

Aparte de eso, Mayavi ofrece una biblioteca llamada TVTK que es una versión más pitonica de las vinculaciones VTK, pero al final elegí VTK simple para minimizar el número de dependencias. Pero deberías echarle un vistazo. Quizás sea justo lo que está buscando.

Al principio me pareció muy útil este tutorial. No se trata de Python, se trata de tcl, pero traducir los ejemplos es trivial y te ayuda a entender la forma en que funciona vtk.

Además, para comenzar, puede consultar los ejemplos en el VTK Wiki. Si no son suficientes, siempre puede verificar el C++ examples y traducirlos a Python. La traducción no es difícil ya que los nombres de los métodos y las propiedades son los mismos. Si lo haces, te recomendamos agregar los ejemplos en la wiki. Hay incluso más ejemplos en el source.

¡Mientras aprende VTK, descubrirá que Ipython es increíble! Tener todo el espacio de nombres VTK a su alcance ayuda enormemente.

En caso de que necesite ayuda más específica, la lista de correo vtk-users es bastante activa. Por último, hay books acerca de VTK, y some of them son gratis. Sin embargo, no se trata de Python.

No he intentado wxPython y VTK juntos, pero eso es porque prefiero PyQt4 sobre wxPython. AFAIK no hay problemas con la integración de VTK con cualquier biblioteca. En cualquier caso, antes de dedicar un tiempo a escribir una GUI, revise ParaView a fondo. Probablemente ya haga lo que quiera, y si no lo hace, ¡también es python scriptable! (Aunque nunca lo he comprobado).

+3

+1: Estoy de acuerdo con que VTK es más fácil. Es difícil, pero todo el desafío con MayaVi y VTK es simplemente aprender sobre VTK, y con MayaVi, es otra barrera. Más tarde, me resultó más fácil comenzar a usar MayaVi ya que esto simplifica algunas cosas que son una molestia (pero que no son difíciles de conceptualizar). – tom10

7

Así como un simple ejemplo del uso de la interfaz de Mayavi mlab para hacer esto (con algunos datos geológicos, incluso!):

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 (La información y el código de manejo de datos de formato (el módulo geoprobe) están disponibles aquí: http://code.google.com/p/python-geoprobe/)

Si bien estoy de acuerdo en que aprender VTK es mejor a largo plazo, puedes ponerte en marcha rápidamente con Mayavi. La gran ventaja es no tener que pasar por aros para obtener sus datos en formato VTK. TVTK y Mayavi le permiten usar directamente matrices numpy.

+0

Para la creación de los archivos VTK puede usar PyEVTK https://bitbucket.org/pauloh/pyevtk. Además, la creación de archivos VTK lecagy a mano es bastante directa. – pmav99

+0

También puede usar las funciones incorporadas en mayavi. Prefiero no tener que tener un formato de archivo separado para la visualización. –

+0

Aclaración: 'a mano 'quiero decir programáticamente. – pmav99

Cuestiones relacionadas