在3D骨架系统DirectX之间转换

时间:2017-07-08 12:54:19

标签: c++ matrix 3d directx skeletal-animation

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

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

appliedMatrices = appliedMatrices * matScale * matRotate * matTranslationFromParent;

但我需要将其转换为使用的格式(从底部节点到顶部,其中translateIn是(ParentPos - EndPartPos)的向量减法,并且转换为(EndPartPos - ParentPos),以及matScale / matRotate / matTranslationFromParent是特定节点SRT):

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

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

1 个答案:

答案 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

如果性能至关重要,则只能对平移向量而不是整个矩阵进行这些计算。