<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    Hi,<br>
    <br>
    Sure, I know this...<br>
    <br>
    const QVector3D branch(...);<br>
    const QVector3D leaf( 0.0f, 1.0f, 0.0f );<br>
    const QVector3D axis = QVector3D::crossProduct( branch, leaf );<br>
    const float cosPlainAngle = QVector3D::dotProduct( branch, leaf );<br>
    const float plainAngle = qRadiansToDegrees( std::acos( cosPlainAngle
    ) );<br>
    const QQuaternion quat = Qt3DCore::QTransform::fromAxisAndAngle(
    axis, plainAngle );<br>
    m_transform->setRotation( quat );<br>
    <br>
    But in a view of Qt 3D this is only a half of the solution. In a
    half of cases this works, but in another cases I need -plainAngle.<br>
    <br>
    So at this point I found the next solution:<br>
    <br>
    static inline bool lessZero( const QVector3D & v )<br>
    {<br>
        return ( v.x() < 0.0f || v.y() < 0.0f || v.z() < 0.0f
    );<br>
    }<br>
    <br>
    if( lessZero( branch ) )<br>
            plainAngle = -plainAngle;<br>
    <br>
    So I actually asked not for the math as it is but for checking of my
    solution for correctness.<br>
    <br>
    <div class="moz-cite-prefix">On 01.04.2018 12:48, Konstantin
      Shegunov wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:CAAz9bHuzYXGVt4cKkRY2Mj3emHoDLVuUfx2PaQhY8PiYhQ7Nug@mail.gmail.com">
      <div dir="ltr">Hi Igor,<br>
        What Bin Chen wrote is probably the most painless way of
        achieving what you want. If you are however interested in the
        math, here goes my stab:<br>
        If I understand you correctly, you know the leaf normal, and the
        branch direction vector, then you're searching for the matrix
        that transforms the former to the latter.<br>
        Basically you need to find the matrix that satisfies: b = A  * n
        (b is the branch direction, n is the leaf normal).<br>
        This equation however is underdetemined, meaning you can have
        several rotations done in sequence that give you the same
        result, so you'd need to do some "trickery". One of the usual
        ways to solve such a problem is to use Euler angles[1], where
        the idea is to make elemental rotations with respect to the
        principle axes of the (global) coordinate systems. To that end
        you'd need to calculate the projections (i.e. dot products) of b
        and n to the principal axes and extract the angles of rotation
        from there, then construct each rotation matrix around a
        principal axis of the coordinate system and finally multiply
        them to obtain the final transformation.<br>
        <br>
        [1]: <a href="https://en.wikipedia.org/wiki/Euler_angles"
          target="_blank" moz-do-not-send="true">https://en.wikipedia.org/<wbr>wiki/Euler_angles</a><br>
        <br>
        I hope that helps.<br>
        Konstantin.</div>
    </blockquote>
    <br>
  </body>
</html>