我想編碼一個第一人稱相機,它的旋轉存儲在一個四元數中。不幸的是,旋轉有問題。如何正確地沿所有軸旋轉四元數?
以下功能負責旋轉相機。參數Mouse
和Speed
傳遞鼠標移動和旋轉速度。然後函數獲取旋轉四元數,旋轉它並存儲結果。順便說一下,我使用的是Bullet Physics,這是類型和功能的來源。
void Rotate(vec2 Mouse, float Speed)
{
btTransform transform = camera->getWorldTransform();
btQuaternion rotation = transform.getRotation();
Mouse = Mouse * Speed; // apply mouse sensitivity
btQuaternion change(Mouse.y, Mouse.x, 0); // create quaternion from angles
rotation = change * rotation; // rotate camera by that
transform.setRotation(rotation);
camera->setWorldTransform(transform);
}
爲了說明產生的相機旋轉當鼠標移動時,我告訴你一個手繪圖。在左側顯示相機實際執行的錯誤旋轉。在右側顯示所需的正確情況。箭頭表示在向上(橙色)和向下(藍色)移動鼠標時相機旋轉的方式。
正如你所看到的,只要偏航爲零,旋轉是正確的。但是它有更多的偏航,相機旋轉的圓圈越小。相反,圓圈應該像經度一樣沿着整個球體運行。
我對四元數不是很熟悉,所以在這裏我問如何正確旋轉它們。
鼠標座標最有可能在屏幕空間,這意味着這樣使用它們幾乎不是一個好主意。相反,使用逆投影矩陣將它們轉換爲世界座標。 – BlackCat 2013-05-05 13:00:10
我的想法是使用鼠標座標'x'和'y'作爲角度來圍繞'up'和'right'向量旋轉相機四元數。我認爲在大多數比賽中都是這樣做的。我不確定您的方法是否有效。你能再解釋一下嗎? – danijar 2013-05-05 13:40:55