我正在努力解决以下问题。我正在处理骨骼动画,我希望(即)玩家的头部跟随空间中的另一个对象。我的上轴是 +Z 我的前轴是 +Y,四元数的大小在 W。我尝试使用 gluLookAt 的台面代码并使用 3x3 矩阵转换为四元数,但它没有按预期工作所以我往另一个方向走……
到目前为止,我得到了以下代码“几乎”工作,至少玩家的头部正在向好的方向旋转(但是 X 角度似乎会影响 Y 旋转轴),但它是直视而不是跟随一个物体大约65度的地板:
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 ) );
有人可以帮我解决这个问题吗...我对四元数有点陌生,真的不知道我在哪里搞砸了。经过相当多的研究,基本上我想做的是类似于 Unity API:http ://docs.unity3d.com/Documentation/ScriptReference/Quaternion.LookRotation.html