我想用GLUT和OpenGL實現第一人稱運動系統。到目前爲止,我已經從左到右掃視,前進/後退運動正常工作。但是,我的問題伴隨着四處張望。我希望能夠像大多數/所有FPS遊戲一樣使用鼠標的移動環視四周。我正在使用gluLookAt來處理我所有的動作/環顧四周。目前,周邊部分看,我有這樣的(從教程中獲得)用OpenGL和GLUT創建一個FPS風格的運動系統
gluLookAt(position.x, position.y, position.z,
position.x + direction.x, position.y + direction.y, position.z + direction.z,
up_vector.x, up_vector.y, up_vector.z);
然後對時,有一個被動的鼠標移動,我檢查它,這樣做:
horizontal_angle += 0.005* float(x - origin_x);
vertical_angle += 0.005* float(y - origin_y);
direction_vector.x = cos(vertical_angle) * sin(horizontal_angle);
direction_vector.y = sin(vertical_angle);
direction_vector.z = cos(vertical_angle) * cos(horizontal_angle);
position.x = sin(horizontal_angle - 3.14f/2.0f);
position.y = 0.0f;
position.z = cos(horizontal_angle - 3.14f/2.0f);
up_vector = crossProduct(right_vector, direction_vector);
然而,這給了我一些非常奇怪,搖擺不定的效果,不是特別接近我想要的。
感謝您的回覆,我想我會和四元組一起去,似乎是一個更好的選擇! – Finn 2014-10-02 01:40:48
萬向節鎖是我們頭部旋轉方式的結果,也就是說,當你直視或直下時,你有一個奇點。你的'基於四元數的解決方案'可以避免萬向節鎖,而不是通過四元數的優勢,但是通過將節距夾緊在兩極之外,所以你不能直視或直下。您也可以夾住Eular角度,從而避免出現問題。如果你不夾緊,那麼四元數不會爲你節省,因爲當'視圖 - 位置'平行於'上'時,它們的交叉積將降到零,並且你得到可怕的萬向節鎖。 – ybungalobill 2016-01-02 22:47:28