动画原理 在UE4/UE5中,动画是通过骨骼动画实现的,这一过程涉及到骨骼(Bone)和蒙皮(Mesh)两个核心概念。骨骼构成了角色的内部结构,而蒙皮则是覆盖在骨骼上的网格模型。通过关键帧动画,我们可以定义骨骼在不同时间点的位置、旋转和缩放,从而驱动蒙皮网格产生动态效果。骨骼动画的本质 UE4/UE5的骨骼动画其实都...
UE用它包装骨骼信息有一个好处,就是可以在其他地方也通过创建这样一个变量来直接访问骨骼信息,比如SkeletalMesh,可以避免每次都先访问USkeleton指针,再访问骨骼,从而提升效率。 类型定义如下 FReferenceSkeleton FMeshBoneInfo RawRefBoneInfo数组保存了所有原始骨骼,不包含VirtualBone,数组元素类型为FMeshBoneInfo。每个...
动画每帧更新由SkeletalMeshComponent::Tick驱动,完整的更新流程很长,包括动画蓝图更新,多线程Update,多线程Evaluate等。这里我们主要关注单个AnimSequence的更新,因此可以简化成3步 获取AnimSequence播放进度时间戳 执行UAnimSequence::GetBonePose,从AnimSequence获取新的Pose 根据得到的Pose,更新SkeletalMeshComponent中骨骼的...
动画原理 在UE4/UE5中,动画是通过骨骼动画实现的,这一过程涉及到骨骼(Bone)和蒙皮(Mesh)两个核心概念。 骨骼构成了角色的内部结构,而蒙皮则是覆盖在骨骼上的网格模型。通过关键帧动画,我们可以定义骨骼在不同时间点的位置、旋转和缩放,从而驱动蒙皮网格产生动态效果。 骨骼动画的本质 UE4/UE5的骨骼动画其实都是通...
通过名字我们可以知道,这个对象做的就是蒙皮的工作。GPUSkin就是在Shader里做蒙皮,而CPUSkin就是在渲染线程里做蒙皮,另外一个Static,就是把SkeletalMeshComponent当成StaticMeshComponent一样来绘制。 在SendRenderDynamicData_Concurrent里,我们可以看到会调用MeshObject->Update,这个函数就是把算好的Pose给刷到渲染线程上...
CPUSkin本质一样,只不过把前面CalcBoneMatrix放到了渲染线程C++代码里,这里就不细说了。 优化 整个流程通了,就可以来具体说说动画的优化了,我们只要围绕整个流程中每个步骤做针对性优化就可以。下面就是一些具体做法: 1.将UpdateAnimation和EvaluateAnimation放到子线程上面去,这样相当于转移了游戏线程的开销。但是如果动...
通过名字我们可以知道,这个对象做的就是蒙皮的工作。GPUSkin就是在Shader里做蒙皮,而CPUSkin就是在渲染线程里做蒙皮,另外一个Static,就是把SkeletalMeshComponent当成StaticMeshComponent一样来绘制。 在SendRenderDynamicData_Concurrent里,我们可以看到会调用MeshObject -> Update,这个函数就是把算好的Pose给刷到渲染线程...
最后,导出为FBX格式,并导入引擎中设置为Skeletal Mesh,不导入材质和贴图。进入Niagara效果制作阶段。在Particle Spawn中,创建Skeleton Mesh Location,并指定导入的骨骼模型。选择Direct(Unfiltered Bones)作为骨骼采样模式,在Bone/Socket Index中选择Return Exec Index。设置Filtered Bones,选择网格体的骨骼...
Lyra本身的Mesh是支持多部位的,如下图,就像很多网游那种换装。 对于主SkeletalMeshComponent,跑的是真正的动画,但是并没有挂任何模型,打开模型文件可以看到只有两个三角形,而子SkeletalMeshComponent里的动画蓝图用的是CopyPose动画蓝图 可以看到,这里就是从父层级上拷贝对应的pose直接用。这样我们就可以做到一个角色身上...
CPUSkin本质一样,只不过把前面CalcBoneMatrix放到了渲染线程C++代码里,这里就不细说了。 优化 整个流程通了,就可以来具体说说动画的优化了,我们只要围绕整个流程中每个步骤做针对性优化就可以。下面就是一些具体做法: 1. 将UpdateAnimation和EvaluateAnimation放到子线程上面去,这样相当于转移了游戏线程的开销。但是如果...