我最近在研究有关BVH文件导入UE4并且还原动作数据的功能,BVH文件是从MotionBuilder中导出的,我在UE4动画蓝图中利用C++自定义了一个动画节点,并每帧对将BVH数据赋值到骨骼点上,但是胳膊、腿总是还原的不正确。MotionBuilder是右手坐标系,Y轴朝上,Z轴朝外,我经过如下空间转换。请教各位请问是哪个环节出了问题?万分感谢!
```c++
void FAnimNode_PlayBVH::EvaluateComponentSpace_AnyThread(FComponentSpacePoseContext& Output)
{
BasePose.EvaluateComponentSpace(Output);
Output.ResetToRefPose();
check(Output.AnimInstanceProxy->GetSkeleton() != nullptr);
const FBoneContainer& BoneContainer = Output.Pose.GetPose().GetBoneContainer();
FTransform ComponentTransform = Output.AnimInstanceProxy->GetComponentTransform();
for (int32 i = 0; i < FrameData.Num(); i++)
{
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, FString::Printf(TEXT("BoneName: %s"), *FrameData[i].BoneName.ToString()));
int32 index = BoneContainer.GetPoseBoneIndexForBoneName(FrameData[i].BoneName);
if (index != -1)
{
FCompactPoseBoneIndex CompactPoseBoneToModify(index);
FTransform NewBoneTM = Output.Pose.GetComponentSpaceTransform(CompactPoseBoneToModify);
//Convert to Bone Space.
if (FrameData[i].TranslationMode == VF_Additive)
{
//Convert to Bone Space.
FAnimationRuntime::ConvertCSTransformToBoneSpace(ComponentTransform, Output.Pose, NewBoneTM, CompactPoseBoneToModify, BCS_ComponentSpace);
NewBoneTM.SetTranslation(FrameData[i].bvhPos);
//Convert back to Component Space.
FAnimationRuntime::ConvertBoneSpaceTransformToCS(ComponentTransform, Output.Pose, NewBoneTM, CompactPoseBoneToModify, BCS_ComponentSpace);
}
FAnimationRuntime::ConvertCSTransformToBoneSpace(ComponentTransform, Output.Pose, NewBoneTM, CompactPoseBoneToModify, BCS_ComponentSpace);
FQuat qx(FVector(1, 0, 0), -FMath::DegreesToRadians(FrameData[i].Xrotation));
FQuat qz(FVector(0, 0, 1), -FMath::DegreesToRadians(FrameData[i].Yrotation));
FQuat qy(FVector(0, 1, 0), -FMath::DegreesToRadians(FrameData[i].Zrotation));
FQuat qu = qy * qz * qx;
NewBoneTM.SetRotation(qu * NewBoneTM.GetRotation());
//Convert back to Component Space.
FAnimationRuntime::ConvertBoneSpaceTransformToCS(ComponentTransform, Output.Pose, NewBoneTM, CompactPoseBoneToModify, BCS_ComponentSpace);
Output.Pose.SetComponentSpaceTransform(CompactPoseBoneToModify, NewBoneTM);
}
}
}