Как найти правильное вращение от одного вектора к другому?

У меня есть два объекта, и у каждого объекта есть два вектора:

нормальный векторвверх вектор

Как на этом изображении:

Вверх вектор перпендикулярен нормальному вектору. Теперь я хочу найти уникальное вращение от одного объекта к другому, как это сделать?

У меня есть один метод, чтобы найти вращение между одним вектором к другому, и это работает. Проблема в том, что мне нужно позаботиться о двух векторах: нормальном и восходящем векторах. Если я использую этот метод для поворота вектора нормали от объекта один к объекту нормали от объекта два, вектор вверх может указывать неправильный путь, и они должны быть параллельны.

Вот код для поиска кратчайшего поворота:

GE::Quat GE::Quat::fromTo(const Vector3 &v1, const Vector3 &v2)
{
    Vector3 a = Vector3::cross(v1, v2);
    Quat q;

    float dot = Vector3::dot(v1, v2);

    if ( dot >= 1 ) 
    {
        q = Quat(0,0,0,1);

    }
    else if ( dot < -0.999999 )
    {
        Vector3 axis = Vector3::cross(Vector3(1,0,0),v2);

        if (axis.length() == 0) // pick another if colinear
                axis = Vector3::cross(Vector3(0,1,0),v2);
        axis.normalize();
        q = Quat::axisToQuat(axis,180);
    }
    else
    {
        float s = sqrt( (1+dot)*2 );
        float invs = 1 / s;

        Vector3 c = Vector3::cross(v1, v2);

        q.x = c.x * invs;
        q.y = c.y * invs;
        q.z = c.z * invs;
        q.w = s * 0.5f;
    }
    q.normalize();
    return q;
}

Что я должен изменить / добавить в этот код, чтобы найти правильный поворот?

Ответы на вопрос(4)

Ваш ответ на вопрос