Quaternion "lookAt" função

Eu estou lutando com o seguinte problema. Estou trabalhando com animação de osso e quero (isto é) a cabeça do jogador seguir um outro objeto no espaço. Meu eixo superior é + Z meu eixo para frente é + Y, e a magnitude do quaternion é em W. Eu tentei usar o código mesa para gluLookAt e usar a matriz 3x3 para transformar em um quaternion mas ele não funciona como esperado então eu vou em outra direção ...

Até agora eu tenho o seguinte código que está "quase" trabalhando, pelo menos, a cabeça do jogador está girando (no entanto, o ângulo X parece afetar o eixo de rotação Y) na boa direção, mas olhando para cima em vez de seguir um objeto em o chão a cerca de 65 graus:

qt LookRotation( v3 lookAt, v3 upDirection )
{
qt t;

v3 forward = lookAt;
v3 up = upDirection;

OrthoNormalize( &forward, &up );

v3 right = v3_cross( up, forward );

mat3 m = mat3_make( right.x, up.x, forward.x,
                    right.y, up.y, forward.y,
                    right.z, up.z, forward.z );

t.w = sqrtf( 1.0f +
             m.r[ 0 ].x +
             m.r[ 1 ].y +
             m.r[ 2 ].z ) * 0.5f;

float w4_recip = 1.0f / ( 4.0f * t.w );

t.x = ( m.r[ 2 ].y - m.r[ 1 ].z ) * w4_recip;

t.y = ( m.r[ 0 ].z - m.r[ 2 ].x ) * w4_recip;

t.z = ( m.r[ 1 ].x - m.r[ 0 ].y ) * w4_recip;

t = qt_normalize( t );

return t;
}

... ...

v3 v = v3_sub( vec4_to_v3( transform.world.r[ 3 ] /* The object XYZ location in the world */),
           skeleton->final_pose.location[ i ] /* i = The head joint location */ );

v = v3_normalize( v );

qt q = LookRotation( v,
        v3_make( 0.0f, 0.0f, 1.0f ) );

Alguém pode me ajudar a descobrir esse problema ... Eu sou meio novo com quaternions e realmente não sei onde eu poderia ter estragado tudo. Depois de bastante pesquisa, basicamente o que eu quero fazer é algo como a API do Unity:http://docs.unity3d.com/Documentation/ScriptReference/Quaternion.LookRotation.html

questionAnswers(3)

yourAnswerToTheQuestion