2011-10-08 18 views
14

Nel mio giorno di lavoro come studente di dottorato di ricerca, eseguo la modellazione geologica. Nel mio tempo libero (principalmente per divertimento), sto imparando Python e sto provando a scrivere un semplice programma per visualizzare i modelli geocellulari 3D.Grafica 3D/4D con Python e wxPython?

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

Il modello geocellular è solo una griglia 3D dove ogni cella della griglia ha un certo valore (come mostrato nella figura a destra). Quindi, vorrei che il mio spettatore fosse in grado di visualizzare un modello di griglia 3D come l'immagine sul lato destro. Inoltre, mi piacerebbe che fosse in grado di visualizzare sezioni trasversali attraverso il modello nelle direzioni x, yez (questo è mostrato nella figura a sinistra).

Vorrei anche che i modelli fossero in grado di ruotare attorno a tutti e tre gli assi e ingrandire e rimpicciolire.

Ho svolto alcune indagini preliminari (principalmente here) e sembra che VisVis e VTK siano due potenziali opzioni. Sto cercando di usare wxPython per la GUI principale e sembra che entrambe le opzioni funzioneranno con wxPython per quanto posso dire.

Domande:

  1. Ho ragione quando dico che penso VisVis e VTK avrebbe funzionato per quello che voglio? È preferibile l'altro?

  2. Quale di queste due opzioni sarebbe la più semplice da implementare?

  3. C'è un'altra opzione che dovrei prendere in considerazione?

Ricordare che sono nuovo di Python e molto nuovo per wxPython.

risposta

13

Quello che state cercando è chiamato voxel visualizzazione, griglia voxel o tali. Prenderò seriamente in considerazione lo MayaVi (mai usato, ma lo tengo d'occhio), sembra che abbia qualcosa di molto vicino here.

Paraview, costruito su VTK come MayaVi, potrebbe essere una buona opzione.

Penso che andare direttamente a VTK per la visualizzazione sia difficile, è troppo basso e probabilmente ti renderà frustrato. Detto questo, si desidera salvare i dati come set di dati VTK per l'apertura in MayaVi/Paraview; non è difficile, devi solo scegliere la struttura giusta (vtkGrid, vtkUnstructedGrid, ...).

3

Se vuoi un modo più semplice di ottenere nel mondo VTK/MayaVi (vedi risposta multa Eudosso), guardare il mlab API ad esso. Ciò porta a convenience tipo matplotlib alle visualizzazioni di base del volume e non ho ancora trovato la necessità di scavare più a fondo nella piattaforma sottostante.

+0

mlab URL/collegamento non funzionante – DevPlayer

10

Nel mio caso, ho scelto di utilizzare direttamente i binding VTK per Python. Ad essere onesti, ho trovato più semplice andare avanti con VTK di Mayavi, in parte perché la documentazione è migliore (molti molti esempi!).Sembrava che Mayavi aggiungesse un altro livello di complessità sulla mia strada per portare a termine il lavoro. Ma tom10 ha ragione. Dopo aver iniziato, l'uso di Mayavi potrebbe essere più semplice.

Oltre a questo, Mayavi offre una libreria denominata TVTK che è una versione più pacchiana dei binding VTK ma alla fine ho scelto VTK semplice per ridurre al minimo il numero di dipendenze. Ma dovresti verificarlo. Forse sarà proprio quello che stai cercando.

All'inizio ho trovato molto utile questo tutorial. Non si tratta di Python, si tratta di tcl, ma la traduzione degli esempi è banale e ti aiuta a capire come funziona vtk.

Inoltre, per iniziare, è possibile controllare gli esempi allo VTK Wiki. Se non bastano, puoi sempre controllare lo C++ examples e tradurli in Python. La traduzione non è difficile in quanto i nomi dei metodi e delle proprietà sono gli stessi. Se lo fai, sei incoraggiato ad aggiungere gli esempi sul wiki. Ci sono ancora più esempi nel source.

Mentre stai imparando VTK, scoprirai che Ipython è fantastico! Avere l'intero spazio dei nomi VTK a portata di mano aiuta enormemente.

In caso sia necessaria una guida più specifica, la mailing list vtk-users è piuttosto attiva. Infine ci sono books su VTK, e some of them sono gratuiti! Non si tratta di Python però.

Non ho provato insieme wxPython e VTK, ma è perché preferisco PyQt4 su wxPython. AFAIK non ci sono problemi con l'integrazione di VTK con entrambe le librerie. In ogni caso, prima di passare il tempo a scrivere una GUI, controlla attentamente ParaView. Probabilmente già fa quello che vuoi, e se non lo fa, è anche python scriptable! (Non l'ho mai controllato però).

+3

+1: Sono d'accordo sul fatto che direttamente su VTK è più facile. È difficile, ma tutte le sfide con MayaVi e VTK sono semplicemente l'apprendimento di VTK e con MayaVi è un'altra barriera. Più tardi, ho trovato più facile iniziare a utilizzare MayaVi in quanto ciò semplifica alcune cose che sono una seccatura (ma che non sono difficili da concettualizzare). – tom10

7

Proprio come un semplice esempio di utilizzare l'interfaccia di Mayavi mlab per fare questo (con alcuni dati geologici, anche!):

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 (il modulo di dati e il codice dei dati in formato di gestione geoprobe) sono disponibili qui: http://code.google.com/p/python-geoprobe/)

Mentre sono d'accordo sul fatto che l'apprendimento del VTK sia migliore a lungo termine, è possibile iniziare subito a funzionare con Mayavi. Il grande vantaggio non è dover saltare attraverso i cerchi per ottenere i dati in formato VTK. TVTK e Mayavi ti permettono di usare direttamente gli array numpy.

+0

Per la creazione dei file VTK è possibile utilizzare PyEVTK https://bitbucket.org/pauloh/pyevtk. Inoltre, la creazione di file VTK di lecagy a mano è abbastanza semplice. – pmav99

+0

Puoi anche usare le funzioni integrate in mayavi. Preferisco semplicemente non avere un formato di file separato per la visualizzazione. –

+0

Chiarimento: "a mano" intendo a livello di programmazione. – pmav99