2017-07-08 47 views
0

我試圖在兩種不同的骨架格式之間進行轉換。我有一個分層骨架。現在在3D骨架系統之間轉換DirectX

在一種形式中,一個給定的節點的矩陣由(DirectX的)來計算(recurively, 從底部節點到頂部,matScale/matRotate/matTranslationFromParent是其中該特定節點SRT):

appliedMatrices = appliedMatrices * matScale * matRotate * matTranslationFromParent;

但我需要將它轉換爲使用(從底部節點到頂部,其中translationIn是矢量減法(ParentPos - EndPartPos)和翻譯出來的(EndPartPos - ParentPos),andmatScale/matRotate/matTranslationFromParent是特定節點SRT):

appliedMatrices = appliedMatrices * matScale * matTranslationOut * matRotate * matTranslationIn * matTranslationFromParent;

如何從第一個格式轉換爲第二個骨架格式(和後面)?

+0

你有沒有對內外翻譯的控制權?這些是相反的(如減法所示)?將格式1轉換爲格式2可以通過將這些翻譯設置爲身份來實現,對嗎? –

+0

他們是反向的,但不幸的是,我無法控制骨架。所以我不能擺脫它們(它會移動骨架節點)。 –

回答

0

如果我們比較兩個版本,我們看到以下兩個部分需要匹配:

matRotate1 * matTranslationFromParent1 
      = matTranslationOut * matRotate2 * matTranslationIn * matTranslationFromParent2 

由於matRotate1matRotate2是唯一的旋轉,這兩個必須相等。因此,這是簡單的:

matRotate1 = matRotate2 

然後,兩個轉換,只有一個未知留給:

//conversion 1 -> 2 
matTranslationFromParent2 = (matTranslationOut * matRotate2 * matTranslationIn)^-1 * matRotate1 * matTranslationFromParent1 
//conversion 2 -> 1 
matTranslationFromParent1 = matRotate1^-1 * matTranslationOut * matRotate2 * matTranslationIn * matTranslationFromParent2 

如果性能是至關重要的,你可以做這些計算僅在平移矢量,而不是整個矩陣。