从世界空间骨骼矩阵计算绑定(bind)姿势/蒙皮矩阵

标签 c animation math vertex skinning

目前我将所有骨骼存储在世界空间中并直接从二进制文件加载它们。

我通过放置一个“箭头对象”来检查这个骨架,其中矩阵 bone_mat 作为“modelmatrix”。按预期工作。

enter image description here

Variable explanations:

 1. bone_mat        = world_space bone matrix (loaded from file)
 2. bind_pose_mat   = relative transformation from parent bone to current bone
 3. skinning_mat    = final joint transformation matrix

下一步是计算绑定(bind)姿势矩阵。相对于其母体的骨基质。

我是这样做的:

    /* bone mat * inverse(parent bone mat) */
    mesh->anim_data.skeleton[i].bind_pose_mat = 
urdMat4MulMat4( mesh->anim_data.skeleton[i].bone_mat, urdMat4Inverse(parent_bone->bone_mat) );

我通过像这样再次将它放入世界空间来检查这个矩阵:

    world_space_mat = 
urdMat4MulMat4( mesh->anim_data.skeleton[i].bind_pose_mat, parent_bone->bone_mat);

这会产生与 bone_mat 相同的矩阵。

根骨骼存储在世界空间中,因为它们不相对于任何父级

root_bone.bind_pose_mat = bone_mat

所以现在我在本地空间,我需要做的就是

/* interpolated vertex = base_vertex * bones[bone_index].bind_pose_mat */ 
mesh->interpolated[i].vertex = urdMat4MulVec3(skeleton[bone_index].bind_pose_mat , mesh->base[i].vertex);

这会导致网格变形。

vertex skinning done wrong

编辑:经过一番思考,看起来我不在本地空间,而是在相对空间(bind_pose 目前是其父级的相对矩阵)。

但我在那里坚持理论。

最佳答案

好的,看起来我成功了。

数学方程式(简化):

v' = SUM { w * m * v }

在哪里

  1. w is the weight (all bones have 1.0 weight currently)
  2. m is the world space bone matrix (animation bone)
  3. v is the relative vertex position of the bind pose
inv_bone_mat = the inverted world space bone matrix
bone_mat = world space bone matrix

计算v:

vec3 v_relative = bind_bones[bone_index].inv_bone_mat * vertex_object_space

现在只需要:

vec3 skinned_vertex = frame[current_frame].anim_bones[bone_index].bone_mat * v_relative

ofc 这可以通过多个骨骼/重量影响来扩展

我希望这对 future 的读者有所帮助。

关于从世界空间骨骼矩阵计算绑定(bind)姿势/蒙皮矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28321033/

相关文章:

algorithm - 用有限的信息计算总的批量上传传输百分比

Python - 将浮点字符串解析为整数

math - float 学有问题吗?

c - 在 C 中使用非标准的数组声明

c++ - 如何使用指向指针的指针

c - scanf + getchar + printf 有什么问题

python - 有没有一种使用 Pygame 制作和保存动画的简单方法?

ios - SwiftUI 中 @GestureState 的显式动画

Javascript - 将元素从任何位置动画到屏幕中心

c - 读取和写入文件时断言兼容架构的最佳方法?