Quaternion "lookAt" -Funktion

Ich kämpfe mit dem folgenden Problem. Ich arbeite mit Knochenanimationen und möchte (dh), dass der Kopf des Spielers einem anderen Objekt im Raum folgt. Meine Aufwärtsachse ist + Z, meine Vorwärtsachse ist + Y und die Größe des Quaternions ist in W. Ich habe versucht, den Mesa-Code für gluLookAt zu verwenden und die 3x3-Matrix zu verwenden, um eine Transformation in ein Quaternion durchzuführen, aber das funktioniert nicht wie erwartet also gehe ich in eine andere richtung ...

Bisher habe ich den folgenden Code erhalten, der "fast" funktioniert, zumindest dreht sich der Kopf des Players (der X-Winkel scheint jedoch die Y-Rotationsachse zu beeinflussen) in die richtige Richtung, aber er schaut gerade nach oben, anstatt einem Objekt zu folgen der Boden bei ca. 65 Grad:

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 ) );

Kann mir jemand helfen, dieses Problem herauszufinden ... Ich bin ein bisschen neu mit Quaternionen und weiß nicht wirklich, wo ich es vermasselt haben könnte. Nach einigen Recherchen möchte ich im Grunde genommen so etwas wie die Unity-API tun:http://docs.unity3d.com/Documentation/ScriptReference/Quaternion.LookRotation.html

Antworten auf die Frage(3)

Ihre Antwort auf die Frage