Im正在努力解決以下問題。我正在使用骨骼動畫,我希望(即)玩家的頭部跟隨太空中的另一個物體。我的上軸是+ Z我的前軸是+ Y,而四元數的大小是在W.我嘗試使用gluLookAt的檯面代碼並使用3x3矩陣轉換爲四元數,但它不能按預期工作所以我走向另一個方向...Quaternion「lookAt」功能
到目前爲止,我得到了下面的代碼是「幾乎」工作,至少在播放器的頭部旋轉(但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));
有人可以幫我弄清楚這個問題...我有點新與四元組,並不真正知道我可以搞砸了。經過相當長的一段研究基本上是我想要做的是一樣的東西統一API:http://docs.unity3d.com/Documentation/ScriptReference/Quaternion.LookRotation.html
在我看來,你應該在第一次旋轉之後使用向量來固定座標系 - 在其他情況下,你的變換會得到不想要的側傾角。 – majakthecoder
爲什麼'dot - (-1.0f)'而不是'dot + 1.0f'? –
@AndyRay還有另外一個比較,它有'dot - (...)',括號內的值可以是'1.0f'或'-1.0f'。以類似的方式輸入它們是有意義的,所以它看起來不錯。 –