2012-07-31 73 views
0

在我的OpenGL應用程序,我有一個遊戲物體類來描述模型 和每個模型都有一個矩陣來描述它的平移/旋轉/縮放 ,每當我想翻譯/旋轉/縮放,我只需撥打 像,Model_Matrix-> translate(dx,dy,dz),其直接在模型矩陣 上操作,從而永久地改變它。首先我想知道,這是正確的做法嗎?因爲許多文章在網上討論了三個矩陣,平移,旋轉和縮放,然後將它們相乘以產生變換矩陣。我只用一個來計算 。OpenGL:組合翻譯/旋轉/縮放矩陣或保持它們分開?

任何人都可以提供一些線索對這個問題的原因,因爲它是現在,我很困惑

注:我知道一些矩陣數學,只是小有一點雖然

回答

0

我會建議保持轉化爲矩陣(每個對象),因爲 - 如果分開保存它們,則會引入有關這些操作執行順序的隱含知識(因此可能會產生不同的結果)。

防止轉換隱式排序的一種方法是使用一個類say - TransformGroup,它可以包含任意數量的TranslateTransform,RotateTransform和ScaleTransform,每個類允許您修改和檢查各個屬性。要查看此方法的示例 - 請參閱here

+0

動畫通常執行單個轉換的操作:這可能是使它們保持分離的原因。 – Luca 2012-07-31 21:52:11

+0

我傾向於做的是使用關鍵幀,即使它們在那裏單獨描述(上面我的解決方案的「編輯器」位),我的代碼將矩陣返回給我。 – Ani 2012-07-31 22:09:46

+0

也許我可以使用一個Matrix進行整個轉換,然後使用3個矩陣進行平移/旋轉/縮放,這樣我就可以輕鬆地跟蹤我的對象,所以當我旋轉對象時,我需要旋轉主矩陣,然後旋轉矩陣以及 – Smeky 2012-08-01 06:44:52

0

如果你真的只需要矩陣本身,簡單地維護一個矩陣並沒有錯。這可能會變得棘手,但如果你想做相機轉換等事情。

想象一下,您有一個矩陣A(之前)和一個矩陣B(之後),並希望您的程序能夠將相機(或物體)從A視角連續移動到B視角。如果您擁有的是確定每個位置的矩陣,這很難(特別是,不是由純矩陣代數唯一確定的)。

但是,如果你這樣做單獨維護的縮放,旋轉和平移,這可能是適合在所有做到這一點不使用矩陣,而是按照gluLookAt功能保持eyecenterup載體。

0

只有一個矩陣的一個缺點是操作相互影響。即如果您製作比例尺(2,2,2),而不是平移比例尺(2,2,2),則您的模型將沿everey軸移動,而不是您所期望的兩倍。 同樣的旋轉問題,但更難理解;)

下一個問題是scale()和rotate()總是使用原點,這意味着如果你想旋轉或縮放,你必須考慮你的位置當前翻譯是,並用此值計算。這是很難做到的。

要找到如何縮放/平移/旋轉的策略,您必須考慮在物體生命的哪個階段要做什麼。建設與後來的運動。

但是,您可以通過粘貼現有的矩陣操作來實現「更好」的矩陣操作。 i。Ë僞

scale(float[3] s, float[3] originPoint) 

將被實現爲

translate(-originPoint); scale(s); translate(originPoint); 

rotate(float alpha, float[3] p1, float[3] p2) 

將被實現爲

translate(-p1); rotate(alpha, p2-p1); translate(p1); 

而且,不使用規模()在所有讓生活更輕鬆。

Cheers,Frank