From: poker_at_physics.usyd.edu.au
Date: Wed Oct 21 2009 - 03:26:59 CDT

Don't worry about it too much; I have the solution now.

thanks,
P.

= = = (the script) = = =puts "This proc will rotate your molecule in the
viewer via the coordinate axis and not camera axis. Note that visual axes are
not rotated by direct mainpulations."
puts "Usage: coord_rot \$axis \$deg. Axis is either 0,1,2 or x,y,z. Deg is the
rotation in degrees, conventionally clockwise."
puts "Usage: coord_rot \$axis \$deg \$step. Rotates the molecule over \$deg by
steps of \$step degs. NB: this is similar to \"rotate z by 360 1\", although
you cannot interact with the tcl interface."

proc coord_rot {axis deg {step 0}} {
if { $axis=="x"} { set axis 0}
if { $axis=="y"} { set axis 1}
if { $axis=="z"} { set axis 2}

if { [expr $deg*$step] < 0 } {
 puts "Steps and Degrees opposing. Will exit due to infinite loop!"
 return
}

#Obtains the rotation matrix of the camera relative to the coordinate axes.
#this matrix represents the vectors of the coordinate axes in the camera fram.
set R [expr [molinfo top get rotate_matrix]]

#Grab the axis of interest.
set e3 [lrange [lindex [transtranspose $R] $axis] 0 2]

if { $step==0 } {
 #Set the rotation about said axis, and apply back to the rotational matrix.
 set M [trans axis $e3 $deg deg]
 set R [transmult $M $R]
 molinfo top set rotate_matrix [list $R]
} else {
 #similar version looping over each step.
 set i $step
 while { abs($i) < abs($deg)} {
  set M [trans axis $e3 $step deg]
  set R [transmult $M $R]
  molinfo top set rotate_matrix [list $R]
  display update ui
  set i [expr $i + $step]
 }
}
}

Quoting poker_at_physics.usyd.edu.au:

> I would like to make an animation with the camera rotating around the
> molecule's
> z-axis (and not its own axis).
>
> I've just checked the two camera navigation plugins and have a few
> questions:
>
> ====
> # R G M iG -> rotates around the REAL Z axis going through origin
>
> # puts "C = [lindex [molinfo top get center_matrix] 0]"
> # puts "R = [lindex [molinfo top get rotate_matrix] 0]"
> # puts "S = [lindex [molinfo top get scale_matrix ] 0]"
> # puts "T = [lindex [molinfo top get global_matrix ] 0]"
> ====
> > R G M iG ...this line sounds like what I want to do, is it a series of
> matrix
> multiplications, with G as the global_matrix ???
>
> What is the global_matrix in this, exactly?
> Can I check that:
> - rotate_matrix is rotation around coordinates defined by center_matrix.
> - scale matrix is zoom... but what do the relevant numbers mean?
>
> Camera axis: Can I directly obtain the relationship of its axis with the
> molecule axis? E.g. a translation/rotation matrix?
>
> thanks,
> P.
>