真正的采样都是GetBonePose方法。 核心逻辑是,外部传递一个时间(保存在FAnimExtractContext结构体中),取到邻近的两帧,结合设置的插值算法,返回数据。实现上要比描述的复杂一些,涉及到压缩相关的处理。 采样的结果,不只是骨骼数据,还包括曲线和属性,这些都是跟动画帧变化的数据。 分3个方法计算,EvaluateCurveData、De...
真正的采样都是GetBonePose方法。 核心逻辑是,外部传递一个时间(保存在FAnimExtractContext结构体中),取到邻近的两帧,结合设置的插值算法,返回数据。实现上要比描述的复杂一些,涉及到压缩相关的处理。 采样的结果,不只是骨骼数据,还包括曲线和属性,这些都是跟动画帧变化的数据。 分3个方法计算:EvaluateCurveData、De...
骨骼和骨骼之间也可以记录相对的Transform,也就是让每一级都在父级的局部空间内做Transform,这样每一级坐标的范围也会明显变小,而且也很像动物的关节一样一节一节动,比较符合实际情况,骨骼数组就变成了一棵树,当我们记录动画时就会更容易,而计算实际的Transform时,只要递归把所有父级的Transform乘在一起,就得到了...
进一步来看,如果每个动画都记录全局Transform数组,可能数据量还是会有些大且不规律。骨骼和骨骼之间也可以记录相对的Transform,也就是让每一级都在父级的局部空间内做Transform,这样每一级坐标的范围也会明显变小,而且也很像动物的关节一样一节一节的动,比较符合实际情况,骨骼数组就变成了一棵树,当我们记录动画时就...
/** Get Bone Transform int world space. */ FTransform GetBoneTransform(const FName& InBoneSocketName) const; protected: UPROPERTY() FVector LastInputVector; }; 2、RPGRootMotionModifier_SyncStride.cpp // Fill out your copyright notice in the Description page of Project Settings. ...
由资源实现,UE提供了几种资源,基础的是UAnimSequence,采样接口在这实现。其他资源,是对资源的另一层封装,包括混合空间和蒙太奇,蒙太奇是个实用的扩展,后面细说。真正的采样都是GetBonePose方法。 核心逻辑是,外部传递一个时间(保存在FAnimExtractContext结构体中),取到邻近的两帧,结合设置的插值算法,返回数据。实现...
由资源实现,UE提供了几种资源,基础的是UAnimSequence,采样接口在这实现。其他资源,是对资源的另一层封装,包括混合空间和蒙太奇,蒙太奇是个实用的扩展,后面细说。真正的采样都是GetBonePose方法。 核心逻辑是,外部传递一个时间(保存在FAnimExtractContext结构体中),取到邻近的两帧,结合设置的插值算法,返回数据。实现...
然后在着色器代码GpuSkinVertexFactory.ush里下面这两个函数可以看到蒙皮的做法,就是把每个骨骼的Transform乘以对应权重并求和,如下图,可以看到GetBoneMatrix里的宏根据是否支持SRV来从不同Buffer里获取实际的骨骼矩阵数据。 计算顶点位置时候,就乘以刚才算的那个最终的骨骼矩阵,就是当前帧实际的顶点位置,如下图:...
两种方式,由BlendTransform函数实现。 基于权重的覆盖:目标变换=源变换*权重 叠加:目标变换=目标变换+(源变换*权重) 姿势混合有3种方式 线性插值:两个姿势的中间姿势,各有权重,用于动画过渡。权重的算法,可以实现不同的曲线,对应不同融合效果。 加法混合:用于叠加,一般是基础动画,加上一个特殊状态,比如在基础的移...
然后在着色器代码GpuSkinVertexFactory.ush里下面这两个函数可以看到蒙皮的做法,就是把每个骨骼的Transform乘以对应权重并求和,如下图,可以看到GetBoneMatrix里的宏根据是否支持SRV来从不同Buffer里获取实际的骨骼矩阵数据。 计算顶点位置时候,就乘以刚才算的那个最终的骨骼矩阵,就是当前帧实际的顶点位置,如下图:...