Directx 11骨骼动画

4
我对骨骼动画感到困惑。我已经阅读了一些相关内容,但仍有一件事我不明白。这是我的结论: 我看到了3种用骨骼来给网格添加动画的方式:
1. 我有一个包含顶点、顶点缓冲区、索引缓冲区、纹理着色器和变换矩阵的网格类。我可以为每个骨骼使用一个类,并添加权重,这样很容易对模型进行动画处理。但这意味着使用了太多内存,因为某些存储的东西只需要使用一次。
2. 使用顶点着色器。在输入顶点参数中添加权重和骨骼索引,并使用矩阵数组作为全局变量,所以在着色器中我只需要使用骨骼的矩阵即可。这个解决方案对我来说似乎更有效,但我记得在DirectX 11教程(来自Rastertek)中他说HLSL应该很快,因为它被频繁使用,我认为这会太重了。无论如何,这是我将尝试的解决方案,至少要知道是否有效。
3. 对于每个骨骼使用矩阵和逆矩阵。据我所知,这是正确的方式。但这是我不理解的方式。为什么要在这里使用矩阵逆?矩阵如何与顶点“链接”?我的意思是,如果我移动右手骨骼的矩阵,那么只有右手顶点会被使用?
所以我的问题是:
1. 第二种方法可行吗?对于某些网格和动画,它是否会过于重?
2. 有人能解释一下矩阵如何与顶点相关联,为什么要使用矩阵逆?或者给我提供关于这方面的信息。
希望你能理解我的问题,因为我不确定我解释得清楚。请原谅我的英语,我尽力了。谢谢。
1个回答

8
第一种方法可以处理模型中只有刚性部件的情况。但是一旦有可变形部件,就会出现孔洞或其他伪像。例如,如果您有一个手臂模型,并旋转前臂,肘部将出现一个孔洞,弯曲处会出现重叠的三角形。
至于第二种方法,我不知道您准备如何实现。像素着色器肯定不是做这个的正确位置。所有需要完成的事情都可以在顶点着色器中完成。
这就引导我们走向第三种方法。
我承认基于骨骼的动画有点棘手。让我们考虑上面的例子:由上臂和前臂组成的手臂模型。对于这个模型,我们需要两个骨骼:一个从肩膀到肘部,另一个从肘部到手部。
每个顶点应该至少与一个骨骼相关联。这是通过顶点权重完成的。假设有一些受肩膀影响的肩部顶点;肘部顶点受两个骨骼的影响,而手部顶点仅受前臂骨骼的影响。这就产生了以下权重:
bone:               | upper arm bone | forearm bone
--------------------+----------------+--------------
shoulder vertices:  |       1        |       0
elbow vertices:     |       0.5      |       0.5
hand vertices:      |       0        |       1

首先要做的是计算所有骨骼的位置和方向。每个骨骼都有一个矩阵来完成这个任务,通常由动画师负责计算这些矩阵。该矩阵将骨骼从某个参考位置放置到其当前位置。参考位置对于所有骨骼都相同,可以自由选择。
接下来要做的是计算结果顶点位置。我们知道顶点随着它们所在的骨骼一起移动。因此,我们需要在骨骼的本地坐标系中获取顶点位置。然而,通常情况下,顶点位置以绑定姿势的世界坐标给出。这就是逆矩阵的作用。它将顶点从世界空间(绑定姿势)转换为骨骼的本地空间。每个骨骼都有一个逆矩阵。
当我们在骨骼的本地坐标系中拥有顶点时,我们必须根据骨骼的运动进行变换。对于肩膀和手部顶点,这个任务很简单。我们可以使用骨骼的矩阵并将其乘以逆矩阵。
对于肘部顶点,这并不容易。事实上,有各种方法来计算变换。我们需要将两个骨骼的变换与给定的权重混合。最简单的方法是将矩阵乘以它们的权重并将它们相加。这会产生最终的变换,可以用于转换顶点位置。
步骤如下(仅适用于一个影响骨骼):
1. 将顶点位置从绑定姿势转换为本地骨骼系统。 2. 与动画师一起计算骨骼变换矩阵。 3. 使用骨骼矩阵将顶点位置从本地骨骼系统转换为动画位置。
如果有多个影响骨骼,则必须混合矩阵。骨骼和顶点之间的链接是通过顶点权重实现的。通常,一个顶点不保存所有骨骼的权重。相反,影响骨骼的最大数量限制为4个。然后,顶点存储前4个最具影响力的骨骼的索引及其权重。

第二种方法,我指的是使用顶点着色器,而不是像素着色器,已经进行了编辑。但我认为我理解了问题所在。当我想要渲染静态模型时,我只需使用我的着色器类中的渲染函数一次,但如果我使用动画模型,则必须为每个骨骼使用此函数,并将世界矩阵乘以骨骼变换作为世界矩阵参数,对吗?顺便说一句,感谢您的解释。 - Aulaulz
1
不,你只需要发出一个绘制调用,提供所有必要的信息,包括矩阵和顶点权重。 - Nico Schertler
那我仍然不明白着色器如何知道前臂的像素将与前臂矩阵相关联。 - Aulaulz
2
我们正在谈论顶点,而不是像素。每个顶点在其顶点声明中具有一个或多个骨骼的索引和权重。骨骼矩阵的有序列表通过常量传递到着色器中。然后着色器可以通过索引查找矩阵,并将其与权重混合。 - Nico Schertler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接