Como encontrar a rotação correta de um vetor para outro?
Eu tenho dois objetos e cada objeto tem dois vetores:
vetor normalvetorComo nesta imagem:
O vetor ativo é perpendicular ao vetor normal. Agora eu quero encontrar uma rotação única de um objeto para outro, como fazer isso?
Eu tenho um método para encontrar a rotação entre um vetor para outro, e funciona. O problema é que preciso cuidar dos dois vetores: vetor normal e vetor up. Se eu usar esse método para girar o vetor normal do objeto um para o normal do objeto dois, o vetor para cima pode estar apontando para o lado errado e eles precisam ser paralelos.
Aqui está o código para encontrar a rotação mais curta:
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;
}
O que devo alterar / adicionar a este código para encontrar a rotação correta?