我已经尝试了几天在游戏中创建3D骨骼动画。我正在使用Java和LWJGL。
在尝试制作动画之前,我正试图在我的程序中实现绑定姿势。我从我从Blender导出的collada文件中加载信息。 我目前在我的游戏中加载了所有这些: 对于我骨架中的每个关节:
骨架是一个层次结构,包含所有关节的列表,以及根关节。它还有绑定形状矩阵和另一个我不确定它用于什么的矩阵。
我将所有皮肤信息加载到每个模型的VBO中(boneIDs及其相应的权重)。
我已经在互联网上阅读了很多关于剥皮的事情,但我完全迷失了。我不知道如何处理所有这些矩阵和东西。
这是我目前的顶点着色器中的内容,我很确定它没问题:
const int MAX_BONES = 32;
in ivec4 boneIDs;
in vec4 boneWeights;
uniform mat4 boneTransforms[MAX_BONES];
void main(void) {
mat4 boneTransform = boneTransforms[boneIDs[0]] * boneWeights[0];
boneTransform += boneTransforms[boneIDs[1]] * boneWeights[1];
boneTransform += boneTransforms[boneIDs[2]] * boneWeights[2];
boneTransform += boneTransforms[boneIDs[3]] * boneWeights[3];
vec4 worldPosition = transformationMatrix * boneTransform * vec4(position, 1.0);
…
我的问题是我不知道矩阵数组应该是什么。我从collada文件中获取的皮肤信息中加载了大量的矩阵,但我不知道它们的关系是什么。
我尝试了一些没有成功的事情。 这是一张图片,其中包含我的模型应该是什么样子,以及它在右边的样子。
着色器中的boneTransforms数组中包含的矩阵如下(我将其称为蒙皮矩阵):
skinningMatrix = parentJoint.localMatrix * localMatrix * inverseBindShapeMatrix of the joint
我在互联网上找到了这个小公式,所以我不知道它是否可以,但它不能很好地工作。
答案 0 :(得分:1)
为了知道你应该发送什么矩阵,你必须先了解原因。逆绑定姿势矩阵将您的顶点放入骨骼空间,以便它们的父关节是原点。然后,一旦在骨骼空间中,将顶点与全局矩阵(存储您想要的当前姿势)相乘,在旋转和正确偏移它们之后将它们返回到正确的空间。但是,不是将两个矩阵数组发送到顶点着色器,而是可以组合反向和当前姿势矩阵,以使一个矩阵乘以顶点。因此,制作一个矩阵数组,对于每个矩阵,将当前姿势矩阵的倒数乘以(按此顺序)。然后将其发送到您的顶点着色器。