Get 3x3 rotation matrix between two TVector3


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,

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);


Thanks for the quick answer!

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.