我想按帧获取一个动画序列所有顶点的位置,所以我需要先获取骨架网格物体的顶点位置。
2条回答 默认 最新
- 开发技术控 2023-05-25 16:19关注
该回答引用ChatGPT
在Unreal Engine 5.1中,可以通过以下步骤获取骨架网格体(Skeletal Mesh)的顶点位置:
- 获取Skeletal Mesh组件(USkeletalMeshComponent)。可以通过获取动画序列绑定的角色(Character)获取,或直接在场景中搜索。
- 拉取Skeletal Mesh资产(UAsset)。可以通过Skeletal Mesh组件的SkeletalMesh属性获取。
- 拉取Skeltal Mesh中使用的骨骼(USkeleton)资产。通过Skeletal Mesh的Skeleton属性获取。
- 遍历骨骼的每一帧(Bone),获得对应骨骼的变换矩阵。
- 对Skeletal Mesh中的每个顶点,通过其骨骼权重(BoneWeights)与步骤4中得到的骨骼变换,计算出该顶点在当前帧的全局变换矩阵。
- 利用步骤5中得到的顶点变换矩阵及Skeletal Mesh原始顶点位置,计算出当前帧下每个顶点的位置。
- 对动画序列的每一帧重复步骤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)); } }
解决 无用评论 打赏 举报
悬赏问题
- ¥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岗位的内部职业发展通道都有哪些,以及各个级别晋升的要求