Directx 11骨骼动画

Aul*_*ulz 3 directx skeletal-animation

我迷失了骨骼动画.我已经读过一些有关这方面的事情,但他们仍然是我不明白的一件事.这是我的结论.我看到了3种使用骨骼为网格设置动画的方法:

  • 我有一个Mesh类,它包含顶点,顶点缓冲区,索引缓冲区和纹理着色器,以及变换矩阵.我可以为每个骨骼使用类,增加重量,我可以轻松地为模型设置动画.但这意味着使用太多的内存,因为存储的某些内容在必须只使用一次时会被使用.

  • 使用顶点着色器.在输入顶点参数中添加权重和骨骼索引,并使用矩阵数组作为全局变量,因此在着色器中我只需要使用骨骼矩阵.这个解决方案似乎对我来说效率更高,但我记得在directx 11教程(来自Rastertek)中他说HLSL应该很快,因为它使用了很多时间,而且我认为这太重了.无论如何这是我会尝试的解决方案,至少知道它是否有效.

  • 为每个骨骼使用矩阵和逆矩阵.至于阅读,这是采取的方式.但这是我不理解的方式.为什么这里使用矩阵求逆,以及矩阵如何"链接"到顶点.我的意思是如果我移动右手骨骼的矩阵,代码中说什么只会使用右手顶点?

所以我的问题是:

  • 第二种方式可行吗?或者对于具有一些网格和动画的GPU来说太多了?
  • 有人可以解释矩阵链接到顶点的方式以及为什么使用矩阵求逆?或者给我一些关于此事的信息.

我希望你能理解我,因为我不确定我解释得好.请原谅我的英语,我尽我所能.提前致谢.

Nic*_*ler 5

如果模型中只有刚性部件,则第一种方法可以工作.只要有可变形的部件,就会出现漏洞或其他伪影.例如,如果你有一个手臂的模型,你旋转前臂,肘部将有一个洞,并在弯曲处有重叠的三角形.

对于第二种方法 - 嗯,我真的不知道你打算怎么做.像素着色器肯定是错误的地方.需要完成的所有事情都可以在顶点着色器中完成.

这导致我们接近3.

我承认基于骨架的动画有点难以理解.让我们考虑上面的例子:一个由上臂和前臂组成的手臂模型.对于这个模型,我们需要两块骨头:一个从肩部到肘部,一个从肘部到手部.

每个顶点应链接到至少一个骨骼.这是通过顶点权重完成的.让我们假设有一些仅受肩部影响的肩顶点.肘顶点受到两个骨骼的影响,手顶点仅受前臂骨骼的影响.这产生以下权重:

bone:               | upper arm bone | forearm bone
--------------------+----------------+--------------
shoulder vertices:  |       1        |       0
elbow vertices:     |       0.5      |       0.5
hand vertices:      |       0        |       1
Run Code Online (Sandbox Code Playgroud)

首先要做的是计算所有骨骼的位置和方向.这是通过每个骨骼的矩阵完成的.通常动画师负责计算这些矩阵.该矩阵将骨骼从某个参考位置放置到其当前位置.所有骨骼的参考位置相同,可以自由选择.

接下来要做的是计算得到的顶点位置.我们知道顶点与它们的骨骼一起移动.因此,我们需要骨骼的局部坐标系中的顶点位置.但是,通常顶点位置在绑定姿势的世界坐标中给出.这就是逆矩阵的用途.它将顶点从世界空间(绑定姿势)转换为骨骼的局部空间.每个骨骼有一个逆矩阵.

当我们在骨骼的局部系统中有顶点时,我们必须根据骨骼的运动来变换它们.对于肩顶点和手顶点,此任务是微不足道的.我们可以使用骨骼的矩阵并将它们乘以逆矩阵.

对于肘顶点,这并不容易.事实上,有多种方法可以计算转换.我们需要将两个骨骼的变换与给定的权重混合在一起.最简单的方法是将矩阵乘以它们的权重并将它们加在一起.这给出了可用于变换顶点位置的最终变换.

步骤是(仅针对一个影响骨骼):

  1. 将顶点位置从绑定姿势转换为局部骨骼系统.
  2. 用动画师计算骨骼变换矩阵.
  3. 使用骨骼矩阵将顶点位置从局部骨骼系统转换为动画位置.

如果存在多个影响骨骼,则必须混合基质.骨骼和顶点的链接是通过顶点权重实现的.通常,顶点不会为所有骨骼保存权重.相反,影响骨骼的最大数量被限制为例如4.然后顶点存储前4个影响最大的骨骼的索引及其权重.

  • 我们谈论的是顶点,而不是像素。每个顶点在其顶点声明中都有一个或多个骨骼的索引和权重。骨骼矩阵的有序列表通过常量传递给着色器。然后着色器可以通过索引查找矩阵并将其与权重混合。 (2认同)