Hi Bob,

I'd like to use this with two side-by-side applets where I am syncing  
the mouse movements using
sync * on; sync * "set syncMouse true"
http://moleculesinmotion.com/aminoacids/
(Surface coloring not correct yet, please ignore.)

Each applet loads an amino acid from a drop-down menu. I have used a  
moveto command to orient their initial positions. It looks to me like  
I want permutation #6 from your list, but I am not sure how to do this  
between two different applets. Can you help?

Frieda

//////////////////////////////////////

Frieda Reichsman, PhD
Molecules in Motion
Interactive Molecular Structures
http://www.moleculesinmotion.com
413-253-2405

//////////////////////////////////////




On Aug 15, 2008, at 10:23 AM, Bob Hanson wrote:

> [blogging here]
>
> You ask -- What the heck are these quaternions? Here's an example of
> where quaternions come in handy in Jmol.
>
> Say you have two files that you want to display sequentially, 1.xyz  
> and
> 2.xyz. They are connected in some way, perhaps because they are two
> files along the same mechanistic pathway. When the user clicks a  
> link to
> switch from Model 1 to Model 2 you want the user to experience no jump
> of orientation -- just a subtly different file. How can that be done?
>
> 1) Well, if the two files have the same basic coordinates, there's no
> real problem. You just use
>
>  load 1.xyz
>  ...user changes orientation...
>  save orientation;
>  load 2.xyz
>  restore orientation;
>
> The save/restore orientation does the trick.
>
> 2) But what if the INITIAL orientations of the two models are  
> different?
> That is, what if generally you might have to use
>
>  load 2.xyz
>  moveto ....
>
> to make 2.xyz line up with 1.xyz? What then? The problem is that if  
> the
> user has manipulated the model, you can do that restore to get back to
> THEIR orientation, but that's for the wrong model, and you can't just
> put the restore before the moveto command, because the moveto will
> override that. What to do?
>
> 3) The solution is to use quaternions. Jmol can report its rotational
> state in terms of a quaternion. All you do is:
>
>  q1 = script("show rotation")
>
> That's it. You now have saved the rotational state. AND, Jmol can now
> rotate any model by that quaternion:
>
>  rotate @q1
>
> So, to apply a user's changes to a DIFFERENT model:
>
>  load 1.xyz
>  ...user changes orientation...
>  q1 = script("show rotation")
>  load 2.xyz
>  moveto 0.0 ...
>  rotate @q1
>
> This is different. It saves the user's changes as a quaternion and  
> then
> applies that quaternion after the moveto. Provided you have used 0
> seconds for the time on that moveto, you won't even see a flicker with
> Jmol 11.6.RC7 (this was recently fixed).
>
> 4) Ah, but there's a catch! The catch is that the user also may have
> changed the zoom or the translation. The solution again uses
> quaternions, but this time in combination with save/restore.  
> Quaternions
> encode the rotation of a model in a RELATIVE SENSE. Thus, if
>
>  q1 = [first rotational state]
>  q2 = [later rotational state]
>
> then the division
>
>  q3 = q2 / q1
>
> gives you the CHANGE in going from the first state to the second
> (sometimes referred to as the "quaternion difference" or "quaternion
> derivative").
>
> So, check this out:
>
>  load 1.xyz
>  ...user changes orientation...
>  q1 = script("show rotation")
>  save orientation o1;
>  load 2.xyz
>  moveto 0.0 ...
>  q2 = script("show rotation")
>  restore orientation o1;
>  rotate @{q2 / q1}
>  rotate @q1
>
> See what that does? We are saving:
>
>  q1  the user's current rotation of model 1
>  o1  the user's full orientation change, including rotation q1, zoom,
> and translation
>  q2  our "default" rotation for model 2
>
> The restore takes us to rotation q1 and applies any user zoom or
> translation changes.
> The first rotation takes us back to our default rotation for Model  
> 2, q2.
> The second rotation applies the change the user made.
>
> By the way, sequential rotations are applied using LEFT  
> multiplication.
> Those two rotations can be combined as:
>
>  rotate @{q1 * q2 / q1}
>
> That's called a similarity transform.
>
> 5) Now, what if you have to rotate BOTH files to get the default
> orientation you want? Then it's a bit more tricky, but not too bad:
>
>  load 1.xyz
>  moveto 0.0 ...
>  q1a = script("show rotation")
>  ...user changes orientation...
>  q1b = script("show rotation")
>  save orientation o1;
>  load 2.xyz
>  moveto 0.0 ...
>  q2 = script("show rotation")
>  restore orientation o1;
>  rotate @{q2 / q1b}
>  rotate @{q1b / q1a}
>
> See what that does? We are saving:
>
>  q1a  our "default" rotation for model 1
>  q1b  the user's current rotation of model 1
>  o1   the user's full orientation change, including rotation q1b,  
> zoom,
> and translation
>  q2   our "default" rotation for model 2
>
> The restore takes us to rotation q1b, along with the user's changes to
> translation and zoom.
> The first rotation takes us back to our default rotation for Model 2,
> q2, but leaves the user's zoom and translation unchanged.
> The second rotation applies the change the user made relative to our
> default for Model 1.
>
>
> 6) Finally, what if we want to allow the user to switch back and forth
> between models with NO orientation jump? This is really cool. Here  
> you go:
>
> First, load an initial file:
>
>  load 1.xyz
>  moveto 0.0 ...
>  q = script("show rotation")
>
>
> Then any later load of ANY file looks like this:
>
>  qrel = quaternion(script("show rotation")) / q
>  save orientation o1;
>  load xxx.xyz
>  moveto 0.0 ...
>  q = script("show rotation")
>  restore orientation o1;
>  rotate @{qrel * q / quaternion(script("show rotation"))}
>
> and now the code is fully symmetric. Put in any file name for  
> "xxx.xyz",
> and this code will preserve orientation based on a custom default  
> rotation.
>
> 7) Summary
>
> Quaternions encode rotations. Their multiplication represents a series
> of rotations, and their division represents changes made to rotational
> states. Jmol web page developers can use quaternions to record
> customized defaults as well as changes the user has made to those
> defaults. These changes can then be applied to OTHER models so as to
> create a seamless transition from one model to another.
>
>
> Bob
>
> -- 
> Robert M. Hanson
> Professor of Chemistry
> St. Olaf College
> Northfield, MN
> http://www.stolaf.edu/people/hansonr
>
>
> If nature does not answer first what we want,
> it is better to take what answer we get.
>
> -- Josiah Willard Gibbs, Lecture XXX, Monday, February 5, 1900
>
>
>
> -------------------------------------------------------------------------
> This SF.Net email is sponsored by the Moblin Your Move Developer's  
> challenge
> Build the coolest Linux based applications with Moblin SDK & win  
> great prizes
> Grand prize is a trip for two to an Open Source event anywhere in  
> the world
> http://moblin-contest.org/redirect.php?banner_id=100&url=/
> _______________________________________________
> Jmol-users mailing list
> Jmol-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/jmol-users


-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Jmol-users mailing list
Jmol-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jmol-users

Reply via email to