Azure Kinect关节转BVH文件:MOTION部分格式疑问
关于BVH文件MOTION部分的核心说明及Azure Kinect数据转动画的解决思路
1. MOTION部分到底存的是什么?
不是全局坐标,是每帧骨骼的局部变换数据,分两种情况:
- 根骨骼(一般是Hips):要存两个数据——全局XYZ平移值 + 局部XYZ旋转值(对应你在HIERARCHY里定义的CHANNELS:
Xposition Yposition Zposition Xrotation Yrotation Zrotation) - 子骨骼(比如Spine、肩膀这类):只存局部XYZ旋转值(对应CHANNELS里的
Xrotation Yrotation Zrotation)。子骨骼的位置由父骨骼变换+自身OFFSET(HIERARCHY里的静止偏移)决定,标准人体BVH里子骨骼不会额外存平移数据
2. 从Azure Kinect关节点转MOTION数据的正确步骤
你直接用全局坐标或平移向量肯定出问题,必须走这几步:
- 先对齐坐标空间:Azure Kinect的坐标系和Blender/BVH的可能不一样(比如Kinect是Y轴向上,Blender默认Z轴向上),得先把关节点坐标转成BVH用的坐标系
- 根骨骼平移直接取全局坐标:转完坐标系的Hips全局坐标,就是MOTION里的
Xposition Yposition Zposition值 - 局部旋转得算相对值:每个骨骼的局部旋转是相对于父骨骼的旋转,不是全局旋转。具体做法:
- 拿到父骨骼和当前骨骼的全局变换(包含位置和旋转)
- 用父骨骼变换的逆矩阵,乘以当前骨骼的全局变换,得到当前骨骼相对于父骨骼的局部变换
- 从这个局部变换里提取旋转部分,转成BVH要求的欧拉角(注意欧拉角的旋转顺序必须和HIERARCHY里CHANNELS的顺序一致,比如CHANNELS写的是X-Y-Z旋转,就必须输出XYZ顺序的欧拉角)
- 别搞混OFFSET和MOTION:HIERARCHY里的OFFSET是骨骼绑定的静止偏移,MOTION的旋转是在这个偏移基础上的动态变化,两者不能叠加错
3. 常见坑点排查
- 先数清楚通道数:根骨骼6个通道,每个子骨骼3个,每帧的数据长度必须和总通道数完全匹配,少一个多一个都会乱
- 欧拉角顺序必须和CHANNELS一致:比如你定义的是Z-Y-X旋转,却输出了X-Y-Z的欧拉角,旋转肯定完全不对
- 坐标空间没转对:比如Kinect的Y向上直接用到Blender的Z向上,动画会上下颠倒,得做轴映射(比如把Kinect的Y轴值转到Blender的Z轴,X或Z轴做镜像)
- 子骨骼直接用全局旋转:这是最常见的错误,必须算相对父骨骼的局部旋转,不然骨骼会飞出去或者扭曲
内容的提问来源于stack exchange,提问作者user20866357
相关产品推荐
相关产品推荐

