Get 3x3 rotation matrix between two TVector3

Hi,

I’m looking for a way to determine the 3x3 rotation matrix R needed to rotate a known TVector3 v1 to another known TVector3 v2, i.e. v2 = R*v1.

Is there some existing routine in ROOT?

Best regards and thanks,
Klaus


ROOT Version: 6.28/04


Hi @canigia,
thank you for reaching out! TVector3 is a legacy class, I recommend switching to DisplacementVector3D and the GenVector package.

In order to determine the rotation matrix R such that v2 = R*v1, you have to compute first the rotation axis v and the angle a. Given DisplacementVector3D v1 and v2, the rotation axis is the cross product, and you can retrieve the angle computing its cosine fist, see the code snippet below.


    auto v = v1.Cross(v2);
    auto cosa = v1.Dot(v2) * 1./std::sqrt(v1.mag2()*v2.mag2());
    auto a = std::acos( cosa ); 
    AxisAngle arot(v,a);
    Rotation3D rot(arot);
    auto vrot = rot(v1);

Cheers,
Monica