【发布时间】: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