在UE5.1中,如何获取骨架网格体的顶点位置?

我想按帧获取一个动画序列所有顶点的位置,所以我需要先获取骨架网格物体的顶点位置。

该回答引用ChatGPT

在Unreal Engine 5.1中,可以通过以下步骤获取骨架网格体(Skeletal Mesh)的顶点位置:

  1. 获取Skeletal Mesh组件(USkeletalMeshComponent)。可以通过获取动画序列绑定的角色(Character)获取,或直接在场景中搜索。
  2. 拉取Skeletal Mesh资产(UAsset)。可以通过Skeletal Mesh组件的SkeletalMesh属性获取。
  3. 拉取Skeltal Mesh中使用的骨骼(USkeleton)资产。通过Skeletal Mesh的Skeleton属性获取。
  4. 遍历骨骼的每一帧(Bone),获得对应骨骼的变换矩阵。
  5. 对Skeletal Mesh中的每个顶点,通过其骨骼权重(BoneWeights)与步骤4中得到的骨骼变换,计算出该顶点在当前帧的全局变换矩阵。
  6. 利用步骤5中得到的顶点变换矩阵及Skeletal Mesh原始顶点位置,计算出当前帧下每个顶点的位置。
  7. 对动画序列的每一帧重复步骤4至6,即可获得整个动画序列中所有顶点的位置变化。
    具体实现代码示例如下:
    cpp
USkeletalMeshComponent* SkelMeshComp = Character->GetMesh(); 
UAsset* Asset = SkelMeshComp->SkeletalMesh;
USkeleton* Skeleton = Asset->Skeleton;

//遍历每一帧
for (int32 Frame = 0; Frame < Animation->GetNumFrames(); ++Frame)  
{
    //获取当前帧的 REFERENCE POSE transform
    FTransform ReferencePoseTransform = Animation->GetReferencePoseTypeTransform(Frame);

    //遍历所有的骨骼
    for (int32 BoneIndex = 0; BoneIndex < Skeleton->GetNumBones(); ++BoneIndex)
    {
        //获得骨骼的变换
        BoneTransform = ReferencePoseTransform * Skeleton->GetRefLocalPoses()[BoneIndex];
    }

    //遍历网格的所有顶点
    for (int32 VertIndex = 0; VertIndex < MeshResource->GetNumVertices(); ++VertIndex) 
    {
        //遍历该顶点的所有骨骼权重
        for (int32 InfluenceIndex = 0; InfluenceIndex < 4; ++InfluenceIndex)
        {
            //计算顶点相对于该骨骼的变换
            VertTransform += Weight * BoneTransform * VertBoneInfluence[InfluenceIndex].Transform;
        }
        //将顶点变换应用于原始顶点位置,获得当前帧下的顶点位置
        VertPosition = VertTransform.TransformPosition(MeshResource->GetVertexPosition(VertIndex));
    }
}