piątek, 9 października 2009

Sterowanie parametrami renderowania VTK za pomocą wbudowanych kontrolek

Aby nasze programy lub skrypty mogły być stosowane dla różnych danych wejściowych warto zaprogramować możliwość ich definiowania. Można to zrobić za pomocą parametrów przekazywanych podczas startu aplikacji, lub też w trakcie jej działania. Pierwsze podejście jest zalecane do określania pliku z danymi, natomiast drugie dla dostrajania parametrów wyświetlania. Najlepiej oczywiście jeżeli zostaną przygotowane kontrolki graficzne, które pozwolą łatwo zmieniać te parametry. VTK nie jest ściśle związane z żadną biblioteką GUI (chociaż pozwala na łatwą integrację), ale dostarcza własny zestaw kontrolek OpenGL (więcej informacji na stronie WIKI projektu i w dziale z przykładami).

W dzisiejszym wpisie zostanie pokazane jak zmienić przykład "Generowanie powierzchni z wykorzystaniem algorytmu Marching Cube w VTK" tak, aby był bardziej interakcyjny i pozwalał na zmianę parametrów w trakcie wykonania programu.

Przykład
W tym przykładzie zostaną użyte dwie kontrolki typu suwak. Jedna do zmiany wartości progowej dla konturu, a druga do zmiany stopnia przezroczystości. W tym celu skorzystamy z następujących klas:
  • vtkSliderRepresentation2D - definiuje parametry wyświetlania komponentu,
  • vtkSliderWidget - odpowiada za narysowanie obiektu suwak na scenie.
Dodatkowo należy przygotować funkcje uruchamiane w momencie zmiany wartości poszczególnych suwaków.

Podany kod źródłowy można przetestować dodając go na końcu skryptu z poprzedniego wpisu.
vtkSliderRepresentation2D sliderIsoValueRep
sliderIsoValueRep SetValue 127
sliderIsoValueRep SetMinimumValue 0
sliderIsoValueRep SetMaximumValue 255
sliderIsoValueRep SetTitleText "Iso Contour Value"
eval [sliderIsoValueRep GetPoint1Coordinate] SetCoordinateSystemToNormalizedDisplay
eval [sliderIsoValueRep GetPoint1Coordinate] SetValue 0.2 0.2
eval [sliderIsoValueRep GetPoint2Coordinate] SetCoordinateSystemToNormalizedDisplay
eval [sliderIsoValueRep GetPoint2Coordinate] SetValue 0.8 0.2
sliderIsoValueRep SetSliderLength 0.02
sliderIsoValueRep SetSliderWidth 0.03
sliderIsoValueRep SetEndCapLength 0.01
sliderIsoValueRep SetEndCapWidth 0.03
sliderIsoValueRep SetTubeWidth 0.005

vtkSliderRepresentation2D sliderOpacityRep
sliderOpacityRep SetValue 0.5
sliderOpacityRep SetMinimumValue 0
sliderOpacityRep SetMaximumValue 1
sliderOpacityRep SetTitleText "Opacity Value"
eval [sliderOpacityRep GetPoint1Coordinate] SetCoordinateSystemToNormalizedDisplay
eval [sliderOpacityRep GetPoint1Coordinate] SetValue 0.2 0.1
eval [sliderOpacityRep GetPoint2Coordinate] SetCoordinateSystemToNormalizedDisplay
eval [sliderOpacityRep GetPoint2Coordinate] SetValue 0.8 0.1
sliderOpacityRep SetSliderLength 0.02
sliderOpacityRep SetSliderWidth 0.03
sliderOpacityRep SetEndCapLength 0.01
sliderOpacityRep SetEndCapWidth 0.03
sliderOpacityRep SetTubeWidth 0.005

vtkSliderWidget sliderIsoValueWidget
sliderIsoValueWidget SetInteractor iren
sliderIsoValueWidget SetRepresentation sliderIsoValueRep
sliderIsoValueWidget SetAnimationModeToAnimate
sliderIsoValueWidget AddObserver InteractionEvent changeIsoValueCallback
sliderIsoValueWidget On

vtkSliderWidget sliderOpacityWidget
sliderOpacityWidget SetInteractor iren
sliderOpacityWidget SetRepresentation sliderOpacityRep
sliderOpacityWidget SetAnimationModeToAnimate
sliderOpacityWidget AddObserver InteractionEvent changeOpacityCallback
sliderOpacityWidget On

proc changeIsoValueCallback {} {
iso SetValue 0 [sliderIsoValueRep GetValue]
}
proc changeOpacityCallback {} {
eval [isoActor GetProperty] SetOpacity [sliderOpacityRep GetValue]
}

Wyniki działania programu dla różnych wartości konturu można prześledzić na poniższej animacji:

Wykorzystanie graficznych kontrolek w VTK może znacznie ułatwić poszukiwanie odpowiednich parametrów wizualizacji, a sama aplikacja jest zdecydowanie łatwiejsza w obsłudze dla typowego użytkownika.

0 komentarze:

Prześlij komentarz