我为我们的小型游戏引擎编写了一个fbx转换器。我坚持使用动画渲染模型。每个时间戳的矩阵看起来都很好,当我只渲染骨骼时,它看起来也像是原始动画。我做了一些快照来展示我的问题。我只是无法弄清楚什么是错的。也许有人能给我一个提示:)
我用于测试的文件是来自FBX-SDK的humanoid.fbx。
着色器应该没问题:
VS_OUT output = (VS_OUT)0;
float4x4 skinTransform = 0;
skinTransform += MatrixPallette[input.BoneIndices.x] * input.Weights.x;
skinTransform += MatrixPallette[input.BoneIndices.y] * input.Weights.y;
skinTransform += MatrixPallette[input.BoneIndices.z] * input.Weights.z;
skinTransform += MatrixPallette[input.BoneIndices.w] * input.Weights.w;
//skinTransform = mul(BindShape, skinTransform);
//Transform Position
float4 worldPosition = mul(input.Position, skinTransform);
float4 viewPosition = mul(worldPosition, matView);
output.Position = mul(viewPosition, matProj);
这是照片。 (右 - >原始) http://www.pic-upload.de/view-13949399/Unbenannt.png.html
答案 0 :(得分:2)
不是计算顶点的“皮肤变换”,而是建议使用提供的变换计算变换顶点,然后使用权重得到组合的变量。插值两个矩阵确实不是一个好主意。
float4 worldPosition = 0;
worldPosition += mul(input.Position, MatrixPallette[input.boneIndicies.x]) * input.Weights.x;
worldPosition += mul(input.Position, MatrixPallette[input.boneIndicies.y]) * input.Weights.y;
worldPosition += mul(input.Position, MatrixPallette[input.boneIndicies.z]) * input.Weights.z;
worldPosition += mul(input.Position, MatrixPallette[input.boneIndicies.w]) * input.Weights.w;
然而,当你看到这样的变形物体时,通常意味着你忘了通过“逆骨转换”将矩阵托盘相乘。逆骨变换是在“皮肤游行”姿势中具有的变换矩阵骨(即,已经装配了对象的原始姿势)。要计算蒙皮对象的正确位置,在矩阵调色板中应该存储组合变换= inverse(skinParadeTransform)*currentTransform
。当前变换是当前动画层次结构中的变换骨骼,而skinParadeTransform是“皮肤阅兵”模式中的原始骨骼变换。 inverse
是矩阵求逆(是的,你必须这样做)。