GASP中的MotionMatching Rewind 调试

在UE5.7的GASP示例项目中,Mover的ABP,默认使用的是StateTree+BlendStack的形式,但是在使用rewind录制回放时发现,PSD没有可以看details的曲线

而用简单的MotionMatching节点(把LocomotionSetup设为0),则能调试

我想调试看看为什么我自己配的start动画之后立马接了loop,而GASP里,start过度到loop有一个Trasition的时间,不知道这个是在哪里配的

Start不会很快切loop的问题我知道了,是因为Start的PSD中 Continuing Pose Cost Bias 调成了-0.3,更倾向于保持,所以不会很快切到loop,但是上边PSD不能查看曲线的问题还是没搞懂

Hey there,

When you enable the mover setup, make sure that you are using the FullMotionMatchingMode to get the correct output, it defaults to using the StateMachine/Blendstack hybrid by default. You can do this in the widget settings. This logging output for the StateMachine/Blendstack hybrid mode is further down in the capture and captures generic choosers and blendstack players; it is not continuously motion-matched.

Dustin

还想补充提问一下,就是在 Rewind 调试中,如果PoseSearch 处于我配置的 PSD_Run 中,那么details中可以看到有 FR、RR、RL 等动画候选

但是如果处于 PSD_Run - PSD_Stand 状态中,那么details 中只有 FR 候选,可是这时候角色其实是向左前移动的,表现为动画是向右前移动的 FR 动画,但是角色向左前放移动

想问下这是什么原因,以及 PSD_Run - PSD_Stand 是表现处于这两个融合的状态么

再补充问一个问题,当我的速度是600的时候,不会选出 PSD_Run,而是使用了默认的 fallback,但是我改成 (300, 601) 就可以了,是不是这个 float range 是左开右闭 的区间范围

在Widget中切换LocomotionSetup,我理解就是切换了 SandboxCharacter_Mover_ABP 中使用哪个,如果是 0,即FullMotionMatchingMode 那就是直接使用节点;如果是1,则使用 StateMachine/Blendstack hybrid 模式。我遇到的问题就是,FullMotionMatchingMode 在 rewind 里可以看到PSD 的曲线值,但是 hybrid 模式 rewind 录制后看不到 PSD 曲线值。

没有太理解你提到的 “it is not continuously motion-matched.” 是什么意思

你好,我来帮忙解释一下。

​ “it is not continuously motion-matched.” 意思是这套新方案不是每帧都进行PoseSearch的匹配。

我必须强调一下,当前这套新组合方案还是Experimental,不建议应用于项目生产中。

这套新方案并不像​FullMotionMatchingMode那样每帧会进行搜索。

它的MotionMatching调用在​SetBlendStackAnimFromChooser函数的第三步,只有当ChooerTable选出的结果内含有Use MM打开才会进行PoseSearch,意味着,当前方案一般仅在过度时进行匹配,前提还得是你勾上Use MM。

你可以尝试将ChooserTable的结果都勾上Use MM,然后Rewind录制查看,有部分段​的PSD是可以看details曲线的

了解了,那我还是先用纯MotionMatching节点的方式尝试和学习,然后我还问了两个问题能帮忙也看下么,感谢

“PSD_Run - PSD_Stand” 意思是 PSD_Run + PSD_Stand

​从你的截图看,你应该使用的是FullMotionMatchingMode方案吧。

在​FullMotionMatchingMode方案的On Update函数中,有一部分逻辑是对ChooserTable进行过滤,选中有效的资源才送进节点进行匹配,可以检查一下,你的ChooerTable配置是否有问题,你想要的结果是否被过滤掉了?

写错了,左闭右开

Float Range的开闭取决于你的配置,可以看Detai面板中​,有“No Min”和“No Max”选项,勾上以为着“(”、“)",不勾以为着“[“、”]”

我看到这个选项了,但是应该这个 nomax 的意思是无上限吧

image.png.png

嘿嘿,不好意思,我搞错了,你说的是对的。

从代码上看,一般情况下,左右都是闭的。

可以在FFloatRangeColumn::Filter函数下个断点看一下,是否是配置上出现的问题。

或者可以Rewind Debug内查看一下ChooserTable的选择,是否是前面两个参数没过造成的

rewind debugger 里没找到哪里可以看 Chooser 的选项值

选中你的"CT_MM_Test",打开资产,上面应该有个DebugTarget,选中你的角色

ChooserTable 里debug确实是 600 没有match,所以使用了默认的stand,感觉是精度问题

还想问一下,就是我看到FullMotionMatching的方式下,start接loop是用 CurvePhase 和 CurvePhase 偏移 -0.01 的方式来进行动画帧选择的(比如PSD_Relaxed_Stand_Run_F_Loops)

我理解这个-0.01的目的是,判断phase是 -1到1,还是1到-1的趋势,避免左右脚算反了(因为如果不考虑这个,右脚在前的0.7曲线值和左脚在前的0.7曲线值是一样的)

有两个问题:

  1. 我自己按这个配了好像没有太生效,还是容易算出来反的,我改成-0.02就好了,这个似乎和帧率有关,-0.01有时候是不是还是按这一帧算,而不是严格意义的上一帧
  2. 为什么相差一帧,两个phase曲线值肯定不相同的情况下,details 里显示算出来两个 cost 都还是0呢,这个cost是怎么用曲线值计算的

Phase不是单纯的左右脚,​一般我们指的是相位,即在行走的循环中,抬腿、放腿、贴地这一系列离散过程的连续表达。

针对0.01和0.02的问题,我并不认为和帧率有关,我们的PoseSearch方案提供了很多参数供用户调试,针对不同的动画训练集,不同的运动模型,不同开发人员的动作审美,参数大概率是不一样的,0.01对于GASP效果好并不代表完全适用于你的项目,都需要按照自己项目的实际情况进行调整,这也是使用MotionMatching方案的难点之一。

cost的计算可以简单的理解为向量差,代码内会稍微复杂一点,有兴趣的可以自己查看一下。​

还有一个问题,是我自己的项目中,PSS的 CurveChannel(Phase的),使用的 contining Pose,GASP 使用的 Chatacter Pose,我理解区别就是如果有 contining Pose就用,没有就是 CharacterPose,Start且Loop的过程,第一帧loop是没有continuPose,第二帧以及之后的每一帧都是 continingPose 和 CharacterPose 是一样的,那表现应该没有区别。但是我选CharacterPose,切到RunLoop就会表现不会,循环卡在几帧动画里。很奇怪

CurveChannel 应该只是计算动画上曲线的值把,那我理解是不是和Pose没有关系?

image.png.png

可能和你理解的有点不一样。

UseCharacterPose:用的是当前角色Pose作为输入,数据需要从PoseHistory内读取

UseContinuingPose:用的是当前播放的动画序列的下一帧Pose数据作为输入,数据从当前的动画序列直接取,无需额外计算

一些适用场景供你参考:

UseCharacterPose:初始搜索时;需要打断当前动画及时响应输入时;需要精确的反应当前角色状态时;

UseContinuingPose:用于动画过度,保持当前动画的连贯性;性能优化,直接取,无需多余计算;

CurveChannel 理论上只关注曲线上的数据