[Chimera-users] orientation matrix

Eric Pettersen pett at cgl.ucsf.edu
Mon Nov 1 12:04:21 PST 2004


On Oct 31, 2004, at 7:28 AM, Miguel Ortiz Lombardía wrote:

> Hi all,
>
> Sorry, this question may be very simple, but I didn't manage to find 
> an answer in the documentation.
>
> Is it possible to read a transformation (rotation + translation) 
> matrix so that the molecule is displayed exactly in the orientation 
> you wish?

This is discussed a little in the programmer's FAQ, question #4 
(http://www.cgl.ucsf.edu/chimera/docs/ProgrammersGuide/faq.html).  But 
that question doesn't talk about how to use an _arbitrary_ 
rotation/translation matrix to set a model's transformation.  
Nonetheless, you should look at it to get the general idea of how to 
set a model's transformation matrix.  At the end of this mail I've 
appended the definition of the Xform class, as our Python-wrapping 
program sees it (therefore, functions that are commented out [with 
'//'] are in the C++ code put not the Python layer).  The routine you 
want is the constructor 'xform' that takes 12 numeric arguments 
defining the transformation matrix and an 'orthogonalize' boolean.  So 
you would generate your transform with:

xf = chimera.Xform(..12 numbers..., orthogonalize=True)

You want 'orthogonalize' to be True so that Chimera will correct for 
any roundoff in your numeric arguments and produce an orthonormal 
matrix that is suitable for use as a transformation matrix.  You then 
use the same general procedures as in FAQ question 4 to set the model 
transform.

Now, this would be much easier if the Midas matrixget/matrixset 
commands were implemented in Chimera.  I will work on that and let you 
know when it's done.  Until then, you will need to use the Xform 
constructor.

                         Eric Pettersen
                         UCSF Computer Graphics Lab
                         pett at cgl.ucsf.edu
                         http://www.cgl.ucsf.edu

class Xform
{
         // WRAP CLASS
         // DON'T CACHE
public:
         Xform();        // same as identity
         // The following static routines are the constructors:
         static Xform    xform(Real r00, Real r01, Real r02, Real t03,
                                 Real r10, Real r11, Real r12, Real t13,
                                 Real r20, Real r21, Real r22, Real t23,
                                 bool orthogonalize = false);
         static Xform    coordFrame(const Vector &x, const Vector &y,
                                 const Vector &z, const Point &origin,
                                 bool orthogonalize = false);
         static Xform    identity();
         static Xform    translation(Real x, Real y, Real z);
         static Xform    translation(const Vector &v);
         static Xform    xRotation(Real angle);
         static Xform    yRotation(Real angle);
         static Xform    zRotation(Real angle);
         static Xform    rotation(Real x, Real y, Real z, Real angle);
         static Xform    rotation(const Vector &axis, Real angle);
         //static Xform  rotation(const Real mat[3][3], bool 
orthogonalize = fals
e);
         static Xform    zAlign(const Point &p0, const Point &p1);
         static Xform    zAlign(const Point &p0, const Vector &v);
         static Xform    lookAt(const Point &eye, const Point &at, const 
Point &u
p);
         static Xform    lookAt(const Point &eye, const Point &at, const 
Vector &
up);
         void            invert();
         void            translate(Real x, Real y, Real z);
         void            translate(const Vector &xyz);
         void            xRotate(Real angle);
         void            yRotate(Real angle);
         void            zRotate(Real angle);
         void            rotate(Real x, Real y, Real z, Real angle);
         void            rotate(const Vector &xyz, Real angle);
         Point           apply(const Point &pt) const;
         Vector          apply(const Vector &vec) const;
         void            premultiply(const Xform &xf);
         void            multiply(const Xform &xf);
         bool            isIdentity() const;
         void            getRotation(/*OUT*/ Vector *axis, /*OUT*/ Real 
*angle) c
onst;
         void    getCoordFrame(/*OUT*/ Vector *x = NULL,
                         /*OUT*/ Vector *y = NULL, /*OUT*/ Vector *z = 
NULL,
                         /*OUT*/ Point *origin = NULL) const;
         void            getTranslation(/*OUT*/ Vector *trans) const;
         //void          get4by4(/*OUT*/ Real mat[4][4]) const;
};




More information about the Chimera-users mailing list