智子计算机加工厂厂长 2023-05-25 14:35 采纳率: 0%
浏览 40

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

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

  • 写回答

2条回答 默认 最新

  • 开发技术控 2023-05-25 16:19
    关注

    该回答引用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));
        }
    } 
    
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 5月25日

悬赏问题

  • ¥15 cfx考虑调整“enforce system memory limit”参数的设置
  • ¥30 航迹分离,航迹增强,误差分析
  • ¥15 Chrome Manifest扩展引用Ajax-hook库拦截请求失败
  • ¥15 用Ros中的Topic通讯方式控制小乌龟的速度,走矩形;编写订阅器代码
  • ¥15 LLM accuracy检测
  • ¥15 pycharm添加远程解释器报错
  • ¥15 如何让子窗口鼠标滚动独立,不要传递消息给主窗口
  • ¥15 如何能达到用ping0.cc检测成这样?如图
  • ¥15 关于#DMA固件#的问题,请各位专家解答!
  • ¥15 请问华为OD岗位的内部职业发展通道都有哪些,以及各个级别晋升的要求