2017-01-16 55 views
0

嘿傢伙我試圖從skinned pos計算unskinned pos。從skinned pos計算unskinned pos

一個皮膚POS計算如下:

FMatrix Matrices[3]; 
float Weights[3]; 
FVector Pos; 
FVector NewPos; 
for(int i = 0; i < 3; i++) 
{ 
    NewPos += Matrices[i].TransformPosition(Pos) * Weights[i]; 
} 

如何計算名次,當矩陣,權重和NewPos都知道嗎?

我知道,對於一個轉變是:

Pos = Matrices[0].InverseTransformPosition(NewPos/Weights[0]);  

它甚至有可能重新計算名次,如果它是如何應該是做什麼?

+0

您開始使用單詞「頂點」,然後切換到使用「pos」。他們是一樣的嗎?你需要在你的問題中使用一致的術語。 – Sabuncu

+0

是的,它們是一樣的。我更新了這個問題以避免混淆。 – user3523937

回答

0

您可以將此TransformPosition調用視爲矩陣時間向量乘法。重量也可以應用於矩陣。所以你有

M1*pos*w1 + M2*pos*w2 + M3*pos*w3 = (w1*M1 + w2*M2 + w3*M3)*pos 

換句話說,你可以使用權重來縮放矩陣,然後添加矩陣。結果將是一個結合了整個操作的單一矩陣。然後你可以使用它的逆變換。

FMatrix Combined; 
for(int i = 0; i < 3; i++) { 
    Combined += Matrices[i] * Weights[i]; 
} 
Combined *= 1/Combined.M[3][3]; 
Pos = Combined.InverseTransformPosition(NewPos); 

正常化的步驟,其中我除以右下角元素,如果發動機被正確處理齊次座標,但顯然這不是這種情況不應該neccessary。因此,如果矩陣可能表示非仿射投影轉換(最後一行不是0 0 0 *),而是使用FVector4代替,則不應使用FVector。如果想要使用FVector,則必須按照上面的方式縮放矩陣,使最後一行爲0 0 0 1

+0

我沒有安裝虛幻。你會得到什麼? 'NewPos'是否如預期的那樣? – MvG

+0

我不小心刪除了我之前的評論,但我更新了更多信息。 – user3523937

+0

@ user3523937:我想我發現了這個問題;相應地更新了我的答案 – MvG