2016-06-29 30 views
2

目前我已經計算這樣視圖矩陣:應該以什麼順序計算視圖矩陣?

viewMatrix = cameraRot * cameraTrans 

和模型矩陣是這樣的:

modelMatrix = modelTrans * modelScale 

其中cameraTrans和modelTrans是平移矩陣,modelScale是縮放矩陣,和cameraRot而modelRot是由四元數產生的旋轉矩陣。

這是正確的嗎?我一直在Google上搜索幾個小時,沒有人提到視圖矩陣的順序,只是模型矩陣。這一切似乎都有效,但我自己編寫了矩陣和四元數實現,所以我不能'告訴這是否是一個錯誤。

(注意:矩陣是主要行)

+1

這個問題沒有單一的答案,因爲它取決於你想達到什麼。對於第一人稱攝像機來說,這看起來是正確的,對於圍繞原點的軌道攝像機而言並非如此。 – BDL

+0

@BDL第一人稱相機就是我想要的。忘了提到這一點。謝謝。 – Computermatronic

回答

2

讓我們來談談座標系之間的轉換。假設你在本地系統上定義了一個點。你想在全局系統中描述它,所以你要做的是旋轉這個點,以便對齊它的座標軸,然後將它轉換到最終位置。您可以通過數學描述如下:

Pg = T*R*Pl, where M = T*R 

這樣,男讓你描述的任何一點,在局部座標系定義,成爲一個全球性的座標系。

你可以做同樣的攝像頭,但你真正需要的是做的正是你已經也就是說,你要描述在全球任意點座標系到相機局部座標系之前完成,逆:

Pc = X*Pg, but what is the value of X? 

你知道:

Pg = Tc*Rc*Pc, so Pc = inv(Tc*RC)*Pg 

爲了話:

X = inv(Tc*Rc) = inv(Rc) * inv(Tc) 

因此,要描述一個點,從局部座標系到相機座標系統,你只需要連接這兩個矩陣:

Pc = inv(Rc)*inv(Tc)*T*R*P, where 
M' = inv(Rc)*inv(Tc)*T*R 

注意某些系統(glm library,例如),定義該矩陣(X)如圖所示,其定義見here。我建議你在這裏也是這樣article

0

你有什麼是正確的。

modelMatrix = modelTranslation * modelRotation * modelScale; // M=TRS 
viewMatrix = cameraOrientation * cameraTranslation; // V=OT 

爲了便於記憶,請首先注意矩陣基本上是向後應用的。讓我們考慮一下M=SRT。所以你有一個立方體,然後翻譯它。但是如果旋轉,它將從原始的軸心點旋轉。然後,一旦應用比例因子,模型將會因爲旋轉後的比例應用而產生偏斜。這一切都很難處理 - 一旦你考慮到這個問題,M=TRS對於大多數目的來說都容易得多。這很難用文字來形容,所以如果你想要一些照片,請告訴我。