2013-07-19 98 views
0

我在遊戲中有以下矩陣我正在進行逆向工程以瞭解它是如何工作的。從ModelViewMatrix獲取角度

我設法捕獲此矩陣當一個模型被呈現:

 0.999971,  0.003148,  -0.006994, 0.000000 
    0.000000,  0.911863,  0.410494, 0.000000 
    0.006903, -0.410485,  0.911844, 0.000000 
-25014.388672, 11944.956055, -19475.357422, 1.000000 

我開始使用計算角度以下:

Point CalculateRotatation(float ModelView[16]) 
{ 
    Point Result; 
    Result.X = atan2(ModelView[9], ModelView[10]) * (180/PI); 
    Result.Y = atan2(-ModelView[8], ModelView[9]) * (180/PI); 
    Result.Z = atan2(ModelView[4], ModelView[0]) * (180/PI); 
    return Result; 
} 

我以下:http://db-in.com/blog/2011/04/cameras-on-opengl-es-2-x/

I」米不知道我是否正確地做。遊戲不使用OpenGL-ES,但我不確定它是否重要。

你們能告訴我,如果我在正確的道路上,或者如果我的計算功能是正確的? Y值似乎是錯誤的。我知道有很多這樣的線索,我通過他們看,但他們似乎並沒有做我所擁有的。他們正在使用點積和交叉產品。我只需要確認或一點幫助。

編輯:我知道這麼多:

我知道了X的計算和Y輪換是正確的。如果我從左向右改變角色的視角,則Z增加/減少。如果我改變角色的視角高度,X會增加/減少。然而,我不知道這是正確的或如何得到它..我有這個圖表: enter image description here

+0

你知道模型和視圖矩陣嗎? – yngccc

+0

確保仔細檢查column-major/row-major,這總是出現差異的地方。 –

+0

我不知道兩個矩陣分開。我用我所知道的一切更新了OP。 – Brandon

回答

3

從旋轉矩陣中提取固定角度可以有多個答案,因爲它涉及反三角和平方根。例如,如果旋轉序列是x-y-z(帶有行向量系統),則公式如下所示。

AngleX = atan2(m11, m22) 
AngleY = atan2(-m02, sqrt(m00^2 + m01^2)) 
AngleZ = atan2(m01, m00) 

但是,這不是故事的結尾。我相信this article會幫助你找到更好的方法。祝你好運!

+0

正是我想要做的:)你能幫我一件事。我的朋友說完全和你一樣。他做了和你一樣的事情:http://pastebin.com/ngusJifF 除了索引X,Y被交換。我認爲你對二維矩陣的處理與我對一維矩陣的處理是一樣的。 – Brandon