2016-07-30 172 views
0

我一直在爲小型遊戲編寫父/子實體系統,並且在嘗試獲取子對象的位置時遇到問題。將本地座標轉換爲全局座標

現在,實體的孩子在父代的座標空間中被變換,旋轉和縮放。這意味着如果我們的父母在(2,3,0)的位置,並且我們在(1,2,1)的位置向該父母添加了一個孩子,則其世界空間是(3,5,1)。

我的問題是,我不知道如何從本地空間(1,2,1)轉換到全局空間(3,5,1)。

明顯的起點是添加父母的位置和孩子的位置。這適用於非旋轉對象。每當旋轉和縮放應用時,雖然它變得混亂,這是我無法弄清楚的。

我讀了一些地方使用矩陣的逆,但超出這一點的解釋並不清楚。任何幫助/數學洞察力/僞代碼將不勝感激,謝謝!

回答

1

只是想發佈這個,以防萬一它幫助任何人造成它導致我相當混亂。

這其實很簡單。您所要做的就是將父實體模型矩陣與子模型矩陣相乘,然後像下面一樣從底部行恢復座標。

在下面的例子中,我們可以看到如何從具有和不具有父項的實體的模型矩陣中獲取位置。 (其實我不這樣做我店單獨每個實體的位置,這是你知道有父,需要在世界空間中的位置的實體正好有用。)

Vector3f Entity::GetPosition() const { 
    Matrix4f matrix; 
    if (GetParent() != 0) { 
     matrix = GetParent()->GetModelMatrix() * GetModelMatrix(); 
    } else { 
     matrix = GetModelMatrix(); 
    } 

    float x = matrix[ 3 ][ 0 ]; 
    float y = matrix[ 3 ][ 1 ]; 
    float z = matrix[ 3 ][ 2 ]; 

    return Vector3f(x, y, z); 
} 

注:我寫的我自己的矩陣實現,所以如何乘法和提取位置很可能會有所不同。