21 Jun, 2009 von Raimar Wagner 1
Visualisierung von Winkelgeschwindigkeiten in Vektorfeldern
Um für ein gegebenes Beschleunigungsfeld die Winkelgeschwindigkeiten zu visualisieren bietet es sich an, an äquidistant gestreuten Stützstellen Würfel zu visualisieren die um die Beschleunigungsachse rotiert. Ein mögliches Beispielfeld ist:
Für die Umsetzung wurde VTK mit den Tcl Bindings verwendet. Zu Beginn benötigen wir zwei vtkPoints
, eines für die geglyphten Würfel und eins für die eigentlichen Punkte im Raum. Im folgenden können wir gridPoints
, glyPoints
als gegeben vorraussetzen. Des weiteren können wir ein Magnituden-Array mag
und ein Beschleunigungs-3Tupel-Array velocity
als gegeben vorraussetzen:
vtkPoints gridPoints vtkPoints glyPoints vtkFloatArray velocity velocity SetNumberOfComponents 3 velocity SetNumberOfValues [expr $x_extend*$y_extend*$z_extend] vtkFloatArray mag mag SetNumberOfComponents 1 mag SetNumberOfValues [expr $x_extend*$y_extend*$z_extend]
Im nächsten Schritt müssen die Würfel Glyphs initialisiert werden und zu jedem cube_$i
ein Mapper und Filter definiert werden.
#iterate thru all glyph points for {set i 0} {$i < [eval glyPoints GetNumberOfPoints]} {incr i} { #create cubes vtkCubeSource cube_$i set pt [glyPoints GetPoint $i] #get nearest pnt set ref [eval loc FindClosestPoint [lindex $pt 0] [lindex $pt 1] [lindex $pt 2] ] set vl [velocity GetTuple3 $ref] #turn and translate vtkTransform cubeTransform_$i cubeTransform_$i PostMultiply cubeTransform_$i Translate 0 0 0 set n [eval norm [lindex $vl 0] [lindex $vl 1] [lindex $vl 2]] cubeTransform_$i RotateWXYZ $n [lindex $vl 0] [lindex $vl 1] [lindex $vl 2] cubeTransform_$i Translate [lindex $pt 0] [lindex $pt 1] [lindex $pt 2] #create filter for transformation vtkTransformPolyDataFilter cubeTransformFilter_$i cubeTransformFilter_$i SetInput [cube_$i GetOutput ] cubeTransformFilter_$i SetTransform cubeTransform_$i #create mapper vtkPolyDataMapper cubeMapper_$i cubeMapper_$i SetInput [cubeTransformFilter_$i GetOutput] }
Im letzten Schritt folgt die Animation mit der Kameradrehung.
#render 900 frames for {set k 0} {$k<900} {incr k} { #rotate all glyphs for {set i 0} {$i<[eval glyPoints GetNumberOfPoints]} {incr i} { set pt [glyPoints GetPoint $i] #find velocity to point set ref [eval loc FindClosestPoint [lindex $pt 0] [lindex $pt 1] [lindex $pt 2] ] set vl [velocity GetTuple3 $ref] #transform every cube cubeTransform_$i Identity cubeTransform_$i Translate 0 0 0 set n [eval norm [lindex $vl 0] [lindex $vl 1] [lindex $vl 2]] cubeTransform_$i RotateWXYZ [expr $k * $n/1000] [lindex $vl 0] [lindex $vl 1] [lindex $vl 2] cubeTransform_$i Translate [lindex $pt 0] [lindex $pt 1] [lindex $pt 2] } #move camera & render frame [ren1 GetActiveCamera] Azimuth 0.1 renWin Render }
Mit zusätzlicher Einblendung der Beschleunigungvektoren sieht das Ergebnis dann so aus: