我想按帧获取一个动画序列所有顶点的位置,所以我需要先获取骨架网格物体的顶点位置。
该回答引用ChatGPT
在Unreal Engine 5.1中,可以通过以下步骤获取骨架网格体(Skeletal Mesh)的顶点位置:
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));
}
}
单例模式常见的实现有懒汉式、饿汉式这两种方式,但是在这里,我不想讨论这两种方式,因为常见所以没有讨论和需要思考的价值。
让我们来看看以下的几种方式的一些实现机制: