【问题标题】:Skeletal animation, transformation multiplication骨骼动画,变换乘法
【发布时间】:2013-08-19 17:07:20
【问题描述】:

我已经实现了一个骨骼动画系统,我似乎遗漏了最后一个细节以使其正常工作。

我制作了一个只有部分角色有骨骼的动画。在这张图片中,火柴人挥舞着手臂,但与火柴人的其余部分相比,手臂挥动的位置错误。 (你几乎看不到他的腿之间)

我将尝试概述我的矩阵计算的基础知识,看看我是否做错了什么。

计算骨骼特定的绝对和相对动画矩阵(基于我的关键帧矩阵数据):

        if (b == this->root) {
                b->absoluteMatrix = M;
            } else {
                b->absoluteMatrix = b->parent->absoluteMatrix * M;
            } 

            b->skinningMatrix = b->absoluteMatrix * inverse(b->offsetMatrix);       

            if (this->currentAnimationTime == 0) {
                cout << "Bone '" << b->name << "' skinningMatrix:\n";
                printMatrix(b->skinningMatrix);

                cout << "Bone '" << b->name << "' absoluteMatrix:\n";
                printMatrix(b->absoluteMatrix);

                cout << "Bone '" << b->name << "' offsetMatrix:\n";
                printMatrix(b->offsetMatrix);

                cout << "---------------------------------\n";
            }

skinningMatrix 我发送到 GPU。这将打印以下内容:

其中 offsetMatrix 是在绑定姿势中从网格空间到骨骼空间的变换。

然后在我的着色器中执行:

layout(location = 0) in vec4 v; // normal vertex data
newVertex = (skinningMatrix[boneIndex.x] * v) * weights.x;
newVertex = (skinningMatrix[boneIndex.y] * v) * weights.y + newVertex;
newVertex = (skinningMatrix[boneIndex.z] * v) * weights.z + newVertex;

关于我的计算可能有什么问题的任何提示?

【问题讨论】:

  • 您发布的内容对我来说看起来不错。您能否详细介绍一下如何计算offsetMatrix?当您的角色处于绑定姿势时,您是否验证了skinningMatrix 是单位矩阵? weights 的总和总是 1?如果每个顶点只使用一根骨头,它会起作用吗?
  • 手臂动画效果正常。手臂本身只是在错误的位置。从 ASSIMP 导入中为每个骨骼获取 offsetMatrix,该文件被记录为:“offsetMatrix 是一种在绑定姿势中从网格空间转换到骨骼空间的变换”。我将它从 aiMatrix4x4 转换为 glm::mat4。我在时间 = 0 时查看我的 skinningmatrix,它不是单位矩阵。如果我想自己计算 bindpose 矩阵,我会在时间 0 获取 absoluteMatrix 吗?还是初始化?
  • 如果有帮助,我在帖子中添加了一些调试输出。

标签: opengl animation glsl skeletal-mesh


【解决方案1】:

我目前正在自己​​处理骨骼动画,我注意到的唯一可能问题是您如何使用 ASSIMP 中的偏移矩阵。所讨论的矩阵是“在绑定姿势中从网格空间转换到骨骼空间”的矩阵。

据我所知,该矩阵旨在“按原样”使用,它本质上会将您的顶点带入骨骼局部空间,然后您将乘以一个“新”全局关节姿势,该姿势将从中获取顶点骨骼空间到模型空间。

当您对矩阵求逆时,您将再次将顶点转换为模型空间,并且与当前动画帧的全局关节姿势相比,将顶点推得更远。

我相信您的解决方案将是删除偏移矩阵的反转,这将导致您的顶点从“模型-关节模型”移动。

【讨论】:

    猜你喜欢
    • 2017-01-30
    • 2012-10-17
    • 2015-07-21
    • 2014-10-16
    • 2017-05-05
    • 2016-02-26
    • 2011-04-02
    • 2021-06-09
    • 2017-05-03
    相关资源
    最近更新 更多