One last example of what can be done with the user-defined graphics. While VMD is not designed for animation, it can be made to animate objects by repeating the cycle of drawing the objects then calling the display update command. Here's an example which has several balls swinging (non-physically) at the end of a chain. If you want to stop it before it finishes, use <Ctrl-C>, but if you catch it in the wrong place and nothing moves, you'll need to execute the command display update on (see section § for details about display updates.
proc swing {} {
# get rid of everything else (if there is anything)
if [expr [molinfo top] != -1] { mol off all }
# create a new graphics molecule to handle just this
mol load graphics "swing"
set mol [molinfo top]
set center {0 0.5 0}
set radius 0.125
set offset ".25 0 0"
set length 1
set firsttime 1
display resetview
axes location off
stage location off
for {set i 0} {$i < 1000} {incr i} {
display update off
scale by 1.003
rotate y by 5
display update on
set top1 [vecsub $center $offset]
set top2 $center
set top3 [vecadd $center $offset]
# compute the bottom location
set bot1 [vecsub $top1 "0 $length 0"]
set bot2 [vecsub $top2 "0 $length 0"]
set bot3 [vecsub $top3 "0 $length 0"]
set xdiff [expr sin($i/10.0)]
set ydiff [expr 1.0 - abs(cos($i/10.0))]
if [expr $xdiff < 0] {
set bot1 [vecadd $bot1 "$xdiff $ydiff 0"]
} else {
set bot3 [vecadd $bot3 "$xdiff $ydiff 0"]
}
if $firsttime {
set firsttime 0
display resetview
} else {
graphics $mol delete all
}
# draw the three different balls/strings in different colors
graphics $mol color red
graphics $mol sphere $bot1 radius $radius
graphics $mol color green
graphics $mol sphere $bot2 radius $radius
graphics $mol color blue
graphics $mol sphere $bot3 radius $radius
graphics $mol materials off
graphics $mol color red
graphics $mol line $top1 $bot1
graphics $mol color green
graphics $mol line $top2 $bot2
graphics $mol color blue
graphics $mol line $top3 $bot3
display reshape
}
display update on
}