środa, 7 października 2009

Generowanie powierzchni z wykorzystaniem algorytmu Marching Cube w VTK

Kolejnym sposobem - po wizualizacji objętościowej (ang. volume rendering) - renderowania danych przestrzennych jest technika generowania powierzchni (ang. surface rendering) z wykorzystaniem algorytmu Marching Cubes. Pozwala ona na wyświetlanie konturu wybranych obiektów i tworzenie dla nich dyskretnych modeli 3D. Obiekty te są reprezentowane za pomocą siatek wypełnionych trójkątami. Otrzymujemy w ten sposób model powierzchniowy obiektu, dla którego możemy dodatkowo zdefiniować stopień przeźroczystości i kolor.

Przykład
Użycie algorytmu Marching Cubes do generowania konturu w VTK jest niezwykle proste. Po odczytaniu danych z pliku wystarczy przekazać je do obiektu vtkMarchingCubes i zdefiniować wartość progową dla obiektu.

package require vtk

set inputFileName [ lindex $argv 0]
set isoLevel [expr [ lindex $argv 1] ]
set opacity [expr [ lindex $argv 2] ]
set color "0.9804 0.9216 0.8431"

vtkStructuredPointsReader reader
reader SetFileName $inputFileName
reader Update

vtkRenderer ren1
vtkRenderWindow renWin
renWin AddRenderer ren1
vtkRenderWindowInteractor iren
iren SetRenderWindow renWin

vtkMarchingCubes iso
iso SetInput [reader GetOutput]
iso SetValue 0 $isoLevel

vtkPolyDataMapper isoMapper
isoMapper SetInput [iso GetOutput]
isoMapper ScalarVisibilityOff

vtkActor isoActor
isoActor SetMapper isoMapper
eval [isoActor GetProperty] SetColor $color
eval [isoActor GetProperty] SetOpacity $opacity

ren1 AddActor isoActor
ren1 SetBackground 0.5 0.6 0.8
ren1 SetGradientBackground 4
renWin SetSize 500 500

iren Initialize
wm withdraw .

Powyższy skrypt zawiera obsługę parametrów wejściowych. Dla przykładowych danych (tooth.vtk) wywołanie może wyglądać w następujący sposób:
tclsh vtk-iso_contour.tcl data/tooth.vtk 128 0.5


Analizując przykład, polecam zrobić eksperymenty na własnych danych zmieniając wartość konturu, kolor i przeźroczystość. Rezultaty jakie w ten sposób możemy uzyskać mogą być naprawdę różne, co widać już po samej zmianie stopnia przeźroczystości:


Możliwości VTK w zakresie generowania konturu nie kończą się na wyświetlaniu tylko jednej powierzchni, ale możemy zdefiniować sobie ich dowolną ilość. Może to być szczególnie przydatne np. w zastosowaniach klinicznych, gdzie każdy organ może zostać osobno wyświetlony.

Wadą techniki surface rendering, o której trzeba na koniec wspomnieć, jest jej wysokie zapotrzebowanie na moc obliczeniową i pamięć operacyjną. Może się okazać, że przy bardziej złożonych obiektach czas oczekiwania będzie na tyle długi, że warto będzie rozważyć skorzystanie z wizualizacji objętościowej.

0 komentarze:

Prześlij komentarz