From: Miguel <mi...@jm...> - 2005-03-10 16:29:10
|
> I thought I would be so bold as to tap into the collective wisdom of li= st > members on 3D graphics to answer what I presume is a simple question. It is a simple question, but getting the right answer was difficult for m= e. I received some help on the mailing list in solving this problem. Search the archives in about Oct 2004. > How would I convert a transformation matrix into a simple x, y, z > rotation/translation in degrees/angstroms? Jmol does this in order to implement 'show orientation' In Jmol you can say 'show transform' to show the 3x3 rotation matrix. 'show orientation' will convert that into zyz rotations in degrees. source code snipped from org/jmol/viewer/TransformManager.java String getRotateZyzText() =7B StringBuffer sb =3D new StringBuffer(); float m22 =3D matrixRotate.m22; float rY =3D (float)Math.acos(m22) * degreesPerRadian; float rZ1, rZ2; if (m22 > .999f =7C=7C m22 < -.999f) =7B rZ1 =3D (float)Math.atan2(matrixRotate.m10, matrixRotate.m11) * degreesPerRadian; rZ2 =3D 0; =7D else =7B rZ1 =3D (float)Math.atan2(matrixRotate.m21, -matrixRotate.m20) * degreesPerRadian; rZ2 =3D (float)Math.atan2(matrixRotate.m12, matrixRotate.m02) * degreesPerRadian; =7D sb.append(=22reset=22); if (rZ1 =21=3D 0) =7B sb.append(=22; rotate z=22); truncate1(sb, rZ1); =7D if (rY =21=3D 0) =7B sb.append(=22; rotate y=22); truncate1(sb, rY); =7D if (rZ2 =21=3D 0) =7B sb.append(=22; rotate z=22); truncate1(sb, rZ2); =7D int zoom =3D getZoomPercent(); if (zoom =21=3D 100) =7B sb.append(=22; zoom =22); sb.append(zoom); =7D int tX =3D (int)getTranslationXPercent(); if (tX =21=3D 0) =7B sb.append(=22; translate x =22); sb.append(tX); =7D int tY =3D (int)getTranslationYPercent(); if (tY =21=3D 0) =7B sb.append(=22; translate y =22); sb.append(tY); =7D return =22=22 + sb + ';'; =7D These transformations are generally done as z,y,z rotate z =23 rotate y =23 rotate z =23 matrixRotate is a 3x3 matrix with individual matrix elements referred to as m00 ... m22 Jmol keeps translation data in separate variables. > For instance > > xyz(1) =3D 0.9856*x+ -0.1690*y+ -0.0104*z+ 21.6301 > xyz(2) =3D 0.1668*x+ 0.9794*y+ -0.1139*z+ 35.6457 > xyz(3) =3D 0.0295*x+ 0.1105*y+ 0.9934*z+ -7.8509 > > I did a least squares fitting of a molecular model and this is the > tranformation matrix. The first 3x3 numbers are of course the x, y and = z > changes and the last column a translational vector (this is by the way,= > from the program O by Alwyn Jones at USF). > > I would like to report these numbers (the movement of a model as a > consequence of the docking) as simple degrees of rotation around the x = y > and z axis, and like wise just translations along the x, y an z axis in= > angstoms. Look up data on Euler Rotations As I recall, there are two standards. zyz is generally used in the scientific community. Something else is used in the CAD (Computer Aided Design) community. > What is the simplest way to do this? > > Responces may be posted off list unless others are interested. > > Thanks=21 > > Albion > > Albion E. Baucom > http://rna.ucsc.edu/albion > > > ------------------------------------------------------- > SF email is sponsored by - The IT Product Guide > Read honest & candid reviews on hundreds of IT Products from real users= . > Discover which products truly live up to the hype. Start reading now. > http://ads.osdn.com/?ad_id=3D6595&alloc_id=3D14396&op=3Dclick > _______________________________________________ > Jmol-developers mailing list > Jmol-developers=40lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/jmol-developers > -------------------------------------------------- Michael T. Howard michael=40howards.org 23 Algonquin Avenue tele 978-474-4559 Andover, MA 01810-5527 cell 978-886-3697 USA fax 978-662-3126 -------------------------------------------------- |