Algorithm 比较3D化身的运动序列

Algorithm 比较3D化身的运动序列,algorithm,unity3d,compare,Algorithm,Unity3d,Compare,我正在Unity的一个项目中工作,我必须比较3D化身所做的练习(动作序列)(使用Kinect传感器从真实用户捕获数据) 我将练习存储在一个文件中,作为一系列帧,每个帧具有以下格式: <frame_number> <body_root_position> <joint_1_quaternion> ... <joint_J_quaternion> ... 在哪里 :(x,y,z) :(x,y,z,w) J:接头数量 现在,假设我有两个文件:一个

我正在Unity的一个项目中工作,我必须比较3D化身所做的练习(动作序列)(使用Kinect传感器从真实用户捕获数据)

我将练习存储在一个文件中,作为一系列帧,每个帧具有以下格式:

<frame_number>
<body_root_position>
<joint_1_quaternion>
...
<joint_J_quaternion>

...
在哪里

:(x,y,z)
:(x,y,z,w)
J:接头数量
现在,假设我有两个文件:一个引用和用户执行的一些练习,它们都具有上面指定的格式。假设ref文件有N帧,用户的文件有M帧,N不一定等于(用户可能开始较慢,结束较快,省略一些移动等)

鉴于这两个文件的特殊格式,比较它们最有效的方法是什么?

在代码中,文件存储为N帧的数组,其中
frames[i]
是定义用户在帧i处的移动的四元数数组
frame[i]
有J个元素,因此
frame[i][J]
是定义关节J在帧i处旋转的四元数

我曾考虑使用动态时间扭曲算法,但我认为我的特定输入可能与算法的预期/操作不兼容。此外,比较方法在某种意义上必须是动态的,即必须扭曲时间


一个可能也不错的想法是,根据输入上应用的一些数学为给定序列生成一个索引,从而将该索引与参考进行比较。

我简要查看了DTW Wikipedia页面,它看起来基本上与序列对齐的Needleman-Wunsch算法完全相同(这是我非常熟悉的)除非使用连续字符而不是离散字符。它应该可以很好地满足您的需要,尽管这需要O(n^2)个时间。你应该计算两点之间的距离(或成本),方法是减去相应的值,然后平方或取它们的绝对值,最后求和;此外,为了获得“良好”的性能,您可能需要将某些重量(例如身体根部位置)高于其他重量。
<body_root_position>: (x, y, z)
<joint_i_quaternion>: (x, y, z, w)
J: number of joints