2013-09-23 57 views
0

假設我有一個包含3個向量的類(一個用於位置,一個用於縮放,一個用於旋轉),我可以使用它們生成一個變換矩陣,用於表示3D空間中對象的位置,旋轉和大小。然後,我將父項/子對象之間的關係,我將父子全局變換矩陣乘以子對象的局部變換矩陣,我得到子對象的全局變量矩陣,這是我用來渲染對象的那個對象,所以當父對象旋轉時,子對象圍繞它旋轉。現在我需要能夠得到一個孩子的本地變換(不是整個矩陣,只是單獨的組件)。我知道孩子的全局變換,我知道父母的全局變換。從全球位置/旋轉/比例更新本地位置/旋轉/比例?

我能得到孩子的地方乘以變換孩子的全球受父母的變換inversed.However變換我真正需要的是能夠明確地做到這一點:

1.To能夠得到孩子的局部位置,只要知道它的全球位置和父母的全球位置生成任何矩陣;

2.爲了能夠得到孩子的地方輪換,只要知道它是全球的旋轉和父母的全球旋轉沒有生成任何矩陣;

3.只要知道它的全球尺度和父母的全球尺度而不是可以生成任何矩陣;

+1

那麼,你有什麼嘗試?例如,第1點你的問題到底是什麼? – Hulk

+0

那麼我需要它像Unity3D中的系統一樣聰明。Unity3D每當你改變一個對象的旋轉時,它的位置就會自動改變,所以它們隨之旋轉。基本上我需要它每次更新一切,但我能做到的唯一方法就是生成矩陣。我不知道是否有更快的方法。 –

+1

你能解釋爲什麼你不想生成任何矩陣?也許如果你能告訴最終目標,我們可以嘗試實現它,而不是專注於避免生成變換矩陣的中間目標。 – Michael

回答

1

如果你想要單獨的答案,那麼它應該是相當直接的(即減去孩子的partent位置,以獲得孩子的相對位移)。 但是我假設你想把它們全部重新組合在一起。如果你開始寫數學,你會發現一個給你這些東西的方程組(這些旋轉將需要考慮到位移等等)。 事情是計算是完全等效的(需要相同數量的計算)來反轉矩陣並進行乘法運算,所以您無法通過其它方式得到任何東西(很可能您會犯錯誤或您做出錯誤緩存更少)。

這些東西通常的設計是使用堆棧並始終保持相對於父項的更改。然後,當你想做某件事時,你需要通過對象層次結構並隨着矩陣的增加進行乘法運算,保持一個堆棧,這樣當你向上移動父對象時,你會在堆棧中彈出一個對象,而不是矩陣的逆乘法。 通過這種方式,您可以獲得非常好的性能,而且對象更加穩定,因爲您不需要對它們進行多次計算(將矩陣與它的逆矩陣相乘幾乎不會給出完美的單位矩陣)。