最近,在研究惯性动作捕捉仪Xsens,通过其提供的SDK来读取model的各个关节节点的数据,然后驱动3D角色模型产生实时动画。我的初步设想是利用DirectX做3D动画展示,DX做骨骼动画比较方面(可以利用自带的.X文件)。
回到动捕数据的读取上来,Xsens MVN SDK提供了函数可连接动捕硬件,并读取运动数据。在SDK文档中给出了程序建议的设计流程:先做各种姿态校正(如T-Pose等),不是很明白这些校正具体能有什么作用,只是听卖方来培训的人说,是校正姿态,可以得到更加精准的数据,我个人估计不做这些校正也是可以用的。Xsens MVN还自带了一个.MVN的2进制文件,可以直接将动捕的数据通过其提供的studio保存至mvn文件,mvn文件的读取和实时读取动捕数据的方法基本是一致的,在早期测试代码时,我都是用MVN文件做测试,这样就省得找一个model穿着衣服跳大神了。
通过SDK提供的函数打开MVN文件后,读取第i帧的姿态pose,其中包含了各个关节的相关运功数据,包括关节的旋转数据(四元数表示)、关节在世界坐标系中的位置、关节的加速度等。这里其实最常用的就是旋转数据和位置信息,关节的位置数据很好理解,就是每个节点在世界坐标系中的位置(XYZ),比较麻烦的是关节的旋转,这个玩意我搞了好几天,不断测试,后来终于想通了,我很欣慰,遂写此文,以做纪念!SDK文档上讲动捕记录的旋转数据是在世界坐标系下的,旋转数据使用四元数quat[4]表示,但是文档中没有仔细说明到底四元数的四个分量是如何对应的,即哪个是w,哪个是x、y、z,经过测试知道记录的顺序是wxyz。动捕获取的数据是在右手坐标系下的,但是Dx使用的是左手坐标系,所以还要进行一下转换,折腾了一会。由于我想做的是利用动捕驱动3D角色,但是这个3D角色各个关节的长度可能和动捕中预设的关节长度不一致,所以,各个关节的位置就不能使用从动捕读取出的关节位置来定位。其实,不需要使用关节的位置信息是完全可以的,只要有根关节的位置及各关节的旋转信息即可。还有一个需要明确的就是各个关节的初始位置是怎样的,及所有关节在不旋转时的姿态。为了找到这个姿态,搜索了好多文档,终于找到了,就是T-Pose时的姿态,也就是说T-Pose是model的初始姿态。根据各个关节在世界坐标系下的旋转矩阵,可以反