Closed ZaVang closed 2 years ago
比如针对hip,只要记录下inital direction的hip局部坐标系A,然后每一帧hip也建立坐标系B,然后算AB之间旋转矩阵就可以了,任意inital direction都可以的
比如针对hip,只要记录下inital direction的hip局部坐标系A,然后每一帧hip也建立坐标系B,然后算AB之间旋转矩阵就可以了,任意inital direction都可以的
道理是这样,但是关键在于坐标系B怎么建立,实际上能选择的B应该很有限吧,我的问题主要是对于任意一个给定的结构不知道怎么选取B
如果是order = 'zyx'顺序的话,那么z方向要保证一致,因为z轴基本固定。这时候要确定Y方向,y由zx叉乘,因此选择lefthip-righthip平面与Z轴叉乘得到,如果lefthip-righthip平面和lefthip-hip平面一致的话,那么结果应该是一样的,你试过之后差距很大么?
如果是order = 'zyx'顺序的话,那么z方向要保证一致,因为z轴基本固定。这时候要确定Y方向,y由zx叉乘,因此选择lefthip-righthip平面与Z轴叉乘得到,如果lefthip-righthip平面和lefthip-hip平面一致的话,那么结果应该是一样的,你试过之后差距很大么?
如果平面一样,结果肯定是一样的。关键是平面的选取方式,我感觉好像可以任意取。老哥你后面有试过自定义的骨骼吗,不是像human3.6m一样的。
@ZaVang 老哥您好,请问您是否解决了骨骼不与坐标轴平行的问题,能否分享一下解决方案呢。敬盼回复!
作者您好,最近一直在研读您的这段代码,其他地方我都没有问题,只有对这个eulermap函数x\y\z_dir的选取有些疑问;比如下面这个
if joint == 'Hip': x_dir = pose[index['LeftHip']] - pose[index['RightHip']] y_dir = None z_dir = pose[index['Spine']] - pose[joint_idx] order = 'zyx'
为什么x_dir是lefthip-righthip而不能是lefthip-hip或者hip-righthip? 再比如这里
elif joint == 'Thorax': x_dir = pose[index['LeftShoulder']] - pose[index['RightShoulder']] y_dir = None z_dir = pose[joint_idx] - pose[index['Spine']] order = 'zyx'
为什么z_dir不能是neck-thorax?
顺便您看看我下面的理解有没有错吗: 按照我的理解,假设第t帧第i个节点的坐标为Ai},他的父节点为Ap,那么我们要求的就是旋转矩阵R使得: Ai-Ap=A_{offset}R 这里面R包含了9个参数,上面有三个方程,R自身每一行是单位向量多了三个条件,同时$R$每两行要正交,这也是三个条件,正好九个方程就个条件。我没有计算任意两个坐标变换的情况,但是上面的方程应该是只有有限解的,我不确定是否唯一。如果我按照这样的方式能解出来的话是否也可替代这个eulermap函数?而且如果解不唯一是否说明这个eulermap函数也不唯一? 另一方面,我自己试了个简单的二维情形,我发现如果选用平行于骨架方向的坐标轴,offset也必须是平行的,不然计算出来动作会有所偏差,会比实际上多旋转了一个欧拉角。但是我现在的任务拿到的inital direction并不是像您代码里那样完全平行于某一坐标轴的,而出于某些原因,我不能将他强行调整成平行于坐标轴那样,因此这个eulermap似乎并不能奏效,对此您有什么好的解决方法吗?
谢谢!