an7306911 2021-08-26 23:04 采纳率: 0%
浏览 145
已结题

请教有关UE4导入BVH文件的问题

我最近在研究有关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);
        }
    }
}


  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 9月3日
    • 创建了问题 8月26日

    悬赏问题

    • ¥100 set_link_state
    • ¥15 虚幻5 UE美术毛发渲染
    • ¥15 CVRP 图论 物流运输优化
    • ¥15 Tableau online 嵌入ppt失败
    • ¥100 支付宝网页转账系统不识别账号
    • ¥15 基于单片机的靶位控制系统
    • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
    • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
    • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
    • ¥15 手机接入宽带网线,如何释放宽带全部速度