Directx 11 骨骼动画

标签 directx skeletal-animation

我迷失了骨骼动画。我读过一些关于这个的东西,但它们仍然是我不明白的一件事。这是我的结论。
我看到了 3 种使用骨骼为网格设置动画的方法:

  • 我有一个 Mesh 类,其中包含顶点、顶点缓冲区、索引缓冲区和纹理着色器以及变换矩阵。我可以为每个骨骼使用类,增加重量,我可以很容易地为模型制作动画。但这意味着使用过多的内存,因为某些存储的东西有时会被使用,而它们只能使用一次。
  • 使用顶点着色器。在输入顶点参数中添加权重和骨骼索引,并使用矩阵数组作为全局变量,因此在着色器中我只需要使用骨骼的矩阵即可。这个解决方案对我来说似乎更有效,但我记得在 directx 11 教程(来自 Rastertek)他说 HLSL 应该很快,因为它使用了很多时间,我认为这太重了。无论如何,这是我会尝试的解决方案,至少要知道它是否有效。
  • 对每个骨骼使用矩阵和逆矩阵。就阅读而言,这是采取的方式。但这是我不明白的方式。为什么在这里使用矩阵逆,以及矩阵如何“链接”到顶点。我的意思是,如果我移动右手骨骼的矩阵,代码中只使用右手顶点是什么意思?

  • 所以我的问题是:
  • 第二种方法可行吗?或者对于带有一些网格和动画的 GPU 来说太多了?
  • 有人可以解释矩阵链接到顶点的方式以及为什么使用矩阵逆吗?或者给我链接一些关于这个的东西。

  • 我希望你能理解我,因为我不确定我解释得好不好。请原谅我的英语,我已经尽力了。提前致谢。

    最佳答案

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

    对于第二种方法 - 好吧,我真的不知道你打算如何做到这一点。像素着色器绝对是错误的地方。所有需要做的事情都可以在顶点着色器中完成。

    这导致我们接近3。

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

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

    bone:               | upper arm bone | forearm bone
    --------------------+----------------+--------------
    shoulder vertices:  |       1        |       0
    elbow vertices:     |       0.5      |       0.5
    hand vertices:      |       0        |       1
    

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

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

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

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

    步骤是(仅针对一个影响骨骼):
  • 将顶点位置从绑定(bind)姿势转换为局部骨骼系统。
  • 用动画师计算骨骼变换矩阵。
  • 使用骨骼矩阵将顶点位置从局部骨骼系统转换为动画位置。

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

    关于Directx 11 骨骼动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18549655/

    相关文章:

    javascript - 如何计算骨骼动画中的最终骨骼矩阵?

    c# - 视频剪辑不会在结束时释放表格

    c++ - 这方程如何简化为

    c# - 来自 C# 的 DirectX

    c# - 使用 Assimp 在 OpenGL (GLSL) 中进行骨骼动画

    OpenGL动画

    opengl - 除了性能优势之外,MipMaps 是否还有其他优势?

    WPF-DirectX 互操作问题(D3DImage)

    javascript - 将 Three.js 骨骼动画更新到新的基于混合器的系统

    c++ - 骨骼动画 : interpolation between transformation matrices (collada)