You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
2.8 KiB
106 lines
2.8 KiB
# KeyFrame.tcl - Keyframes for vtk
|
|
#
|
|
# These procs provide a simple (yet powerful) keyframing capability
|
|
# for vtk tcl applications
|
|
# A keyframe contains a time sorted ordering of methods
|
|
# and arguments for an object. Key locations, colors, and
|
|
# other parameters are stored and can be interpolated
|
|
# at intermediate points.
|
|
# The protocol for keyframing is illustrated in the following
|
|
# example to keyframe the position of the camera camera1:
|
|
# the renderer ren1:
|
|
# 1) KeyNew CameraPosition camera1 SetPosition
|
|
# create a keyframe for camera1 that will use the
|
|
# SetPosition method of the camera
|
|
# 2) KeyAdd CameraPosition camera1 [camera1 GetPosition]
|
|
# adds the current camera position as a key frame
|
|
# 3) Repeat 2, changing the camera position for each step
|
|
# 4) KeyRun CameraPosition 30
|
|
# runs key frame for 30 steps. Steps that lie
|
|
# between keyframes are interpolated with Cubic Splines.
|
|
# After each step is interpolated, the proc KeyRender
|
|
# is invoked. This proc can be redefined by the use to
|
|
# do something more sophisticated. The default proc does
|
|
# a: renWin Render
|
|
#
|
|
############################################
|
|
# Create a new keyframe for object and method
|
|
proc KeyNew {keyFrame object method} {
|
|
upvar $keyFrame a
|
|
set a(object) $object
|
|
set a(method) $method
|
|
set a(counter) 0
|
|
set a(debug) 0
|
|
}
|
|
|
|
#
|
|
# Reset the keyframe count to 0
|
|
proc KeyReset {keyFrame} {
|
|
upvar $keyFrame a
|
|
set a(counter) 0
|
|
if { $a(debug) == 1} {puts "Resetting $keyFrame"}
|
|
}
|
|
|
|
#
|
|
# Add a new keyframe with contents value
|
|
proc KeyAdd {keyFrame value} {
|
|
upvar $keyFrame a
|
|
set a($a(counter)) $value
|
|
incr a(counter)
|
|
}
|
|
|
|
#
|
|
# Run a keyframe for "frames" frames
|
|
proc KeyRun {keyFrame frames} {
|
|
upvar $keyFrame a
|
|
set object $a(object)
|
|
set method $a(method)
|
|
set depends [llength $a(0)]
|
|
#
|
|
# create splines if they do not exist
|
|
#
|
|
for {set j 0} {$j < $depends} {incr j} {
|
|
set spline $object${method}Spline$j
|
|
if {[info commands $spline] == ""} {
|
|
vtkKochanekSpline $spline
|
|
}
|
|
$spline RemoveAllPoints
|
|
}
|
|
#
|
|
# add points to the splines
|
|
#
|
|
for {set i 0} {$i < $a(counter)} {incr i} {
|
|
for {set j 0} {$j < $depends} {incr j} {
|
|
$object${method}Spline$j AddPoint $i [lindex $a($i) $j]
|
|
}
|
|
}
|
|
#
|
|
# evaluate splines at key frames
|
|
#
|
|
for {set i 0} {$i < $frames} {incr i} {
|
|
set t [expr ( $a(counter) - 1.0 ) / ( $frames - 1) * $i]
|
|
KeyGoto a $t
|
|
}
|
|
}
|
|
|
|
# Goto keyframe #
|
|
proc KeyGoto {keyFrame t} {
|
|
upvar $keyFrame a
|
|
set object $a(object)
|
|
set method $a(method)
|
|
set depends [llength $a(0)]
|
|
set keyCommand "$object $method "
|
|
for {set j 0} {$j < $depends} {incr j} {
|
|
lappend keyCommand "[$object${method}Spline$j Evaluate $t]"
|
|
}
|
|
if {$a(debug) == 1} {puts "$keyCommand"}
|
|
eval $keyCommand
|
|
KeyRender
|
|
}
|
|
|
|
# Called after keyframe is executed
|
|
proc KeyRender {} {
|
|
renWin Render
|
|
}
|
|
|
|
|
|
|