Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基于FBX的骨骼动画_C++_Model_Directx_Converter_Fbx - Fatal编程技术网

C++ 基于FBX的骨骼动画

C++ 基于FBX的骨骼动画,c++,model,directx,converter,fbx,C++,Model,Directx,Converter,Fbx,我正在为我们的小游戏引擎编写一个fbx转换器。我坚持使用动画渲染模型。每个时间戳的矩阵看起来都很好,当我只渲染骨骼时,它看起来也像原始动画。我拍了一些快照来显示我的问题。我就是不知道出了什么问题。也许有人能给我一个提示:) 我用于测试的文件是fbx-SDK中的humanoid.fbx 着色器应该正常: VS_OUT output = (VS_OUT)0; float4x4 skinTransform = 0; skinTransform += MatrixPallette[input.Bone

我正在为我们的小游戏引擎编写一个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);
这是照片。(右->原始)

我建议使用提供的变换计算变换后的顶点,然后使用权重获得组合泊松,而不是计算顶点的“蒙皮变换”。插值两个矩阵真的不是一个好主意

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;

然而,当你们看到这种变形的物体时,通常意味着你们忘记了用“骨逆变换”乘以矩阵Pallete。逆骨骼变换是骨骼在“皮肤游行”姿势(即,装配对象的原始姿势)中的变换矩阵。要计算蒙皮对象的正确位置,应在矩阵托盘中存储组合变换=
逆(skinParadeTransform)*currentTransform
。当前变换是骨骼在当前动画层次中的变换,skinParadeTransform是“蒙皮游行”模式下的原始骨骼变换<代码>逆是矩阵逆(是的,你必须这么做)

正如你已经提到的,我需要逆骨骼变换。但我还发现FBX中的顶点在对象空间中,你必须将它们转换为全局空间。在这篇文章中提到:[link]@MathiasHölzl:“对象”和“全局”空间之间的唯一区别是一个额外的矩阵乘法。在包括场景层次(*.x)的某些其他格式中,对象也存储在“对象空间”中,并在文件中的其他位置为其指定了相应的变换。