2013-07-19 57 views
0

我有一個在OpenGL ES場景中旋轉「相機」的傳感器派生的四元數。 此外,我將這個四元數的倒數應用於場景中的某些對象,所以它們「面對」「相機」 - 這可以按預期工作。 問題是,我需要取消這些對象在Z軸上的旋轉。 我如何想出一個在Z分量內沒有旋轉的四元數?如何否定任何單一軸上的GLM四元數旋轉?

我的測試: 我試圖提取歐拉角,創建一個否定四元數,並建立了旋轉矩陣從兩個四元數相乘這些對象 - 結果是不正確的。

glm::quat rMQ = cam->getCameraQuaternion();// retrieve camera quat 
glm::vec3 a = glm::eulerAngles((rMQ))* 3.14159f/180.f; // Euler angle set derived 
glm::quat rMZ = glm::angleAxis(-a.z, vec3(0.0f, 0.0f, 1.0f)); // negating quaternion 
glm::mat4 fM = glm::inverse(glm::mat4_cast(rMQ*rMZ)); //final mat4 for GL rotation 

回答

0

儘量簡單地歸零時的四元數的「Z」分量,然後重新正火。

四元數,當用來表示旋轉時,可以被認爲是'軸角'表示。

1

當使用四元數時,只有一個軸和一個角度,沒有「z軸上的旋轉」。您需要轉換爲歐拉,翻轉一個組件的符號,然後轉換回四元組。

對於歐拉角,由您來定義旋轉的順序。旋轉是不可交換的,所以順序很重要,這就是爲什麼沒有將旋轉分解爲組件的原因。通常順序是xyz,但沒有理由爲什麼必須這樣。在某些API中,您可以選擇訂單。