21 Jun, 2009 von Raimar Wagner
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:








[...] Für ein Beispiel siehe “Visualisierung von Winkelgeschwindigkeiten in Vektorfeldern”. [...]