baojunshan / pose3d2bvh

body25 + hand pose3d to bvh
12 stars 2 forks source link

骨骼自旋的问题 #2

Closed dddyyyplus closed 1 year ago

dddyyyplus commented 1 year ago

师兄您好,我看了github上一些pose转bvh的项目中都会用到您写的类似 x_dir = None y_dir = pose[index['heel_r']] - pose[joint_idx] z_dir = pose[joint_idx] - pose[index['knee_r']] order = 'zxy' 这样的代码,这个和您提到的

对于人体骨骼而言,其自旋仅凭keypoints是无法或者很难精确算出的,需要其他先验知识,在这里就不展开了。

这个是不是有关系,这个x_dir,y_dir,z_dir的设定以及后续的代码我理解的是一个求解新的局部坐标系的过程,然后来据此算出方向余弦矩阵,请问几个*_dir的设计是什么原理呀,我有点理不太清,按照上面那个例子的意思是说ZoY平面始终是由这两段关节组成的这个平面嘛,这个是可以肯定的吗,不会有不一样的情况吗,希望您能给我简单讲一下,麻烦您了,谢谢!

baojunshan commented 1 year ago

举个简单的例子,比如求解肩膀的节点 elif joint.startswith("shoulder"): suffix = joint[-1] x_dir = pose[index['elbow_l']] - pose[joint_idx] if suffix == "l" else \ pose[jointidx] - pose[index[f'elbow{suffix}']] y_dir = None z_dir = pose[jointidx] - pose[index[f'wrist{suffix}']] order = 'xyz' 肩膀节点的相对旋转取决于手肘和手腕,假设是T pose手掌向下转为手掌向上,其算下来肩膀节点的相对旋转是不变的,也就是说,大臂和小臂的自旋求解不到。当然,我们也可以用其他平面来代替手肘和手腕组成的平面,但是自旋依旧很难准确的求解出来。 最近没有在做这方面的研究了,可能有新的方法去解决这方面的问题,之前比较普遍的pose转bvh的做法是通过smpl之类的模型进行转换,或者直接通过模型预测旋转。

dddyyyplus commented 1 year ago

明白了,您这么说我也想通了,谢谢师兄这么晚还回复我,祝您生活顺心,万事胜意!