对于HMMR(我的fork),,主要修改在
$hmmr/demo_video.py
中($hmmr
代表自己环境下的hmmr项目的根目录),将旋转以 3乘3矩阵 的形式存进json,预测的结果保存在$hmmr/demo_output/$视频名称/rot_output/rot_output.json
。
除此之外,还写了$hmmr/src/cam_rot.py
脚本,用来预测 cam 的旋转。
Assets/Scripts/HMMR/JsonReader.cs
脚本负责将 rot_output.json
读入,挂在 m_avg_root 下的脚本
负责管理所有关节。
挂在每个子关节下有一个RotateTest脚本,这个由JointManager控制,负责真正驱动每个关节。
2D 关键点保存在 $hmmr/demo_output/$视频名称/AlphaPose_output/alphapose-results-forvis-tracked.json
中,需要借助 2D 关键点恢复根关节。
名为 Train 的游戏对象挂的 KeyPointManager
就是负责梯度下降恢复根关节的脚本。(这里其实解耦没做好,管理2D点渲染应该和训练应该分开,这里图省事写一起了。。)
private void Start()
{
string path = @"C:\Users\sunxiaohan01\Desktop\sxh_git\human_dynamics\demo_output\paoku\video_frames\camrot.json";
/// 以下省略
}
KeyPointManager.cs
的 46 行 path 即为保存摄像机旋转的json路径。
private bool isCamRotate = false;
默认是摄像机无旋转的。如果有的话将它改为true。
至于摄像机旋转,可以通过$hmmr/src/cam_rot.py
获得,会生成camrot.json
。
在 KeyPointManager.cs
的第 84 到 86 行,
StartCoroutine(RepeatGD());
表示优化第 0 帧的摄像机的位置和旋转。
StartCoroutine(Train());
表示优化位移,优化完会自动保存在 $hmmr/demo_output/$视频名称/rot_output/rootpos.json
恢复了根节点位移后,在 JointManager
下勾选
即可加载位移。
这边的功能基本就是由 HMMR2DM.cs
实现。
要可视化 HMMR 骨架和 DeepMimic 骨架,
勾选 Issync
要将 Retargeting 结果保存下来,勾选 Iswrite,这里默认的路径是在 $DeepMimic/data/motions/
下。
smoothfactor 代表了指数平滑的系数,但是这里 1.0 是不平滑, 0 是平滑到最大(所有帧都是第0帧的动作了)
建议取 0.1 到 0.6 之间。在写文件的时候会自动平滑。
对于DeepMimic (我的 fork),修改有训练过程图表可视化、录制动作、恢复多地形和坐标轴可视化。以及在Unity 中可视化最后的结果。
训练结果输出写在 rl_agent.py
中,要可视化它,运行
showplot.py
代码实现在C++部分
具体使用:按大写R键开始录制,再按一次R,就会把这之间的骨骼动画全部 record下来,保存在
output/motion.json
(output文件夹要自己创建,gitignore了)这个可以在 unity 中播放。
原始的DeepMimic只有 plane ,现在支持
,在
args/
下改变参数即可。(这边涉及的代码改动太多,这里略去,可以参考github原版和我的fork之间src/sim/下的.cpp的多处区别)
由 DMJsonReader
实现。
(这里解析动作文件和控制关节运动包括motion blend都写在这一个脚本里了)