骨架动画中的最终顶点位置

时间:2016-06-18 10:48:31

标签: opengl math matrix 3d transform

在骨骼动画中我无法理解。

我不明白如何使用影响他的所有关节的矩阵来计算瞬间T的顶点的最终位置P.

我现在正在做的是:

  1. 计算我的骨架中每个关节的瞬时T的所有变换矩阵;现在我用即时T进行我的测试,这是一个帧,因此不需要插值(所以我猜这里没有错误)
  2. 在顶点V的初始坐标上使用先前计算的变换矩阵,如下所示:

    P=(0.0f,0.0f,0.0f)
    for every joints J affecting vertex V
        transformMatrix = J.matrix * weight
        P = P + transformMatrix * V.coord
    V.coord = P
    
  3. 在这里,我假设每个关节的J.matrix都是正确的T.对象。我在这个计算中做错了吗?我注意到我从未使用任何反向绑定矩阵,说实话,我也不能真正理解这个矩阵的目的。

    编辑:嗯,让我们举个例子让事情变得更容易,告诉我你是否看到任何错误。

    我计算顶点V的最终位置(-1.0f,-1.0f,-1.0f,1.0f)。 让我们考虑2个骨骼影响V,B1和B2,其中:

    B1:联合矩阵J1 - 反向绑定矩阵IBM1

    [1][0][0][0]     [1][0][0][0]
    [0][0][1][0]     [0][0][-1][0]
    [0][-1][0][0]    [0][1][0][0]
    [0][0][0][1]     [0][0][0][1]
    

    B2:联合矩阵J2 - 反向绑定矩阵IBM2

    [0][0][1][0]     [1][1][0][0]
    [1][0][1][0]     [1][0][0][0]
    [1][0][0][0]     [0][0][1][0]
    [0][1][0][1]     [0][0][0][1]
    

    绑定形状矩阵BSM是

    [0.5][0][0][0]
    [0][0.5][0][0]
    [0][0][1.5][0]
    [0][0][0][1]
    

    B1和B2的权重分别为0.6和0.4,B2是B1的子项。

    我正在做的是:

    1. 计算V * BSM,每个骨头都相同,所以我把它保存在R中,这样做

      R = [-0.5][-0.5][-1.5][1]
      
    2. 计算R * IBM1和R * IBM2,它给了我

      IM1=[-0.5][-1.5][0.5][1]   IM2=[-1][-0.5][-1.5][1]
      
    3. 计算IM1 * J1和IM2 * J2,结果为

      X1 = [-0.5][0.5][1.5][1]    X2 = [-2][1][-1.5][1]
      
    4. 用每个骨骼重量思考结果,总结它们,我认为这是V的最终位置,结果是

      V = [-1.2][0.7][0.3][1]
      
    5. 我是这样做的吗?我看到一些人使用相对关节矩阵,所以例如联合矩阵J2将是J1 * J2的结果。这不是我在这里做的,这是一个错误吗?

0 个答案:

没有答案