Как найти правильное вращение от одного вектора к другому?
У меня есть два объекта, и у каждого объекта есть два вектора:
нормальный векторвверх векторКак на этом изображении:
Вверх вектор перпендикулярен нормальному вектору. Теперь я хочу найти уникальное вращение от одного объекта к другому, как это сделать?
У меня есть один метод, чтобы найти вращение между одним вектором к другому, и это работает. Проблема в том, что мне нужно позаботиться о двух векторах: нормальном и восходящем векторах. Если я использую этот метод для поворота вектора нормали от объекта один к объекту нормали от объекта два, вектор вверх может указывать неправильный путь, и они должны быть параллельны.
Вот код для поиска кратчайшего поворота:
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;
}
Что я должен изменить / добавить в этот код, чтобы найти правильный поворот?