0

我正在尝试在两种不同的骨架格式之间进行转换。我有一个分层的骨架。

现在在一种格式中,给定节点的矩阵由 (DirectX) 计算(递归地,从底部节点到顶部,其中 matScale/matRotate/matTranslationFromParent 是特定节点 SRT):

appliedMatrices = appliedMatrices * matScale * matRotate * matTranslationFromParent;

但是我需要将它转换为使用的格式(递归地,从底部节点到顶部,其中translationIn 是(ParentPos - EndPartPos)的矢量减法,而translation out 是(EndPartPos - ParentPos),而matScale / matRotate / matTranslationFromParent 就是那个特定的节点 SRT):

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

如何从第一种格式转换为第二种骨架格式(并返回)?

4

1 回答 1

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

如果性能很关键,您可以只对平移向量而不是整个矩阵进行这些计算。

于 2017-07-09T18:01:26.777 回答