yanchxx / MoPA

An Blender addon uses ROMP to extract human's 3D poses from image, video or webcam and drive your own 3D character.
MIT License
242 stars 49 forks source link

关于driveCharacter函数 #33

Closed JunfengLiu1 closed 1 year ago

JunfengLiu1 commented 1 year ago

作者您好,我有以下两个问题: 1.我注意到您使用四元数来表示旋转的。请问在driveCharacter(rotations, translation)中的rotation参数是如何从romp的结果中转换而来的呢

2.在 1 中,每一个bone的旋转向量的原点是什么呢

yanchxx commented 1 year ago
  1. getAxisAngle函数,将轴角表示分开成轴和角,然后传给Blender的Quaternion函数就变成四元数了。不过实际上scipy有个函数可以直接转换,我忘记叫啥了。
  2. 原点就是骨头坐标系呀,将整个坐标系进行一个旋转。
JunfengLiu1 commented 1 year ago

好的,我想通过您的项目学习动捕方面的知识。我仍然有一些疑惑: 1.在getAxisAngle函数中,在求w旋转轴的时候,w = poses[i:i+3]/(theta+1e-6)为什么要加上1e-6呢? 2.我并不是很了解骨头坐标系。我的理解是:根节点是“cam_trans”对应的点,它的子节点是pelvis,然后每个bone的轴角都是相对于它的父节点(还是都是相对于根节点呢?求解)。请问是否是这样的呢? 3.请问为什么要将整个坐标系进行一个旋转呢,我在unity中驱动自己的与smpl骨骼相似的模型时也需要这样吗? 4.我注意到在‘driveCharacter’函数中,if scene.translation: bones['Pelvis'].location = Vector((100 * translation[0], -100 * translation[1], -100 * translation[2]))您直接把‘cam_trans’赋值给了pelvis的位置,可cam_trans不是root的坐标吗https://github.com/Arthur151/ROMP/blob/a349c6bf4d6229b8fba2e900d38ef210888937d0/simple_romp/romp/smpl.py#L102 https://github.com/Arthur151/ROMP/issues/403#issuecomment-1379961202 而且我注意到您好像只对pelvis的位置进行了赋值,那么其他节点的location是怎么来的呢? 感谢!

zhewei-mt commented 1 year ago

好的,我想通过您的项目学习动捕方面的知识。我仍然有一些疑惑: 1.在getAxisAngle函数中,在求w旋转轴的时候,w = poses[i:i+3]/(theta+1e-6)为什么要加上1e-6呢? 2.我并不是很了解骨头坐标系。我的理解是:根节点是“cam_trans”对应的点,它的子节点是pelvis,然后每个bone的轴角都是相对于它的父节点(还是都是相对于根节点呢?求解)。请问是否是这样的呢? 3.请问为什么要将整个坐标系进行一个旋转呢,我在unity中驱动自己的与smpl骨骼相似的模型时也需要这样吗? 4.我注意到在‘driveCharacter’函数中,if scene.translation: bones['Pelvis'].location = Vector((100 * translation[0], -100 * translation[1], -100 * translation[2]))您直接把‘cam_trans’赋值给了pelvis的位置,可cam_trans不是root的坐标吗https://github.com/Arthur151/ROMP/blob/a349c6bf4d6229b8fba2e900d38ef210888937d0/simple_romp/romp/smpl.py#L102 Arthur151/ROMP#403 (comment) 而且我注意到您好像只对pelvis的位置进行了赋值,那么其他节点的location是怎么来的呢? 感谢!

  1. 为了防止theta为0导致的报错
  2. 除了pelvis,每个bone都是关于其父节点的转动的。pelvis对应的是人的全局旋转
  3. smpl模型出来并不是一个正的tpose,而是绕着x轴(第一个坐标轴)旋转180度后的人像,所以需要转回来让人物正着
  4. 不清楚
  5. 其他节点的位置可以根据smpl的6890顶点估算出来。作者这个repo并不需要关节点的位置信息,只需要每个关节点旋转信息去驱动blender的人物。 回答并不一定正确,仅做参考哈
zhewei-mt commented 1 year ago

好的,我想通过您的项目学习动捕方面的知识。我仍然有一些疑惑: 1.在getAxisAngle函数中,在求w旋转轴的时候,w = poses[i:i+3]/(theta+1e-6)为什么要加上1e-6呢? 2.我并不是很了解骨头坐标系。我的理解是:根节点是“cam_trans”对应的点,它的子节点是pelvis,然后每个bone的轴角都是相对于它的父节点(还是都是相对于根节点呢?求解)。请问是否是这样的呢? 3.请问为什么要将整个坐标系进行一个旋转呢,我在unity中驱动自己的与smpl骨骼相似的模型时也需要这样吗? 4.我注意到在‘driveCharacter’函数中,if scene.translation: bones['Pelvis'].location = Vector((100 * translation[0], -100 * translation[1], -100 * translation[2]))您直接把‘cam_trans’赋值给了pelvis的位置,可cam_trans不是root的坐标吗https://github.com/Arthur151/ROMP/blob/a349c6bf4d6229b8fba2e900d38ef210888937d0/simple_romp/romp/smpl.py#L102 Arthur151/ROMP#403 (comment) 而且我注意到您好像只对pelvis的位置进行了赋值,那么其他节点的location是怎么来的呢? 感谢!

4的话虽然不知道作者为什么能这样做,我对相机标定也不太熟悉;但是smpl的root就是pelvis节点

JunfengLiu1 commented 1 year ago

@zhewei-mt 感谢您的回答!5.可是作者驱动的人物模型不是smpl模型呀,应该也不是6890个顶点,在自己的人物模型中怎么算呢 4.romp好像有一个root点,然后导出的.npy中的包括pelvis的所有24个节点的3d位置都是相对于这个root的 2.请问pelvis的轴角的原点是什么呢,其他的都是父节点,pelvis的轴角是否比较特殊呢?

zhewei-mt commented 1 year ago
  1. 驱动的是blender里面的数字人,不用算这个关节点的位置,只需要知道每个关节点的旋转信息就可以了,blender根据旋转信息去转每个关节
  2. 那我就不清楚了
  3. pelvis的原点就在pelvis啊;pelvis的轴角对应整个人物全局的旋转,比如正对着,背对着等。其他23个关节点都是相对父节点的旋转信息。两个的意义是不一样的
JunfengLiu1 commented 1 year ago
  1. 驱动的是blender里面的数字人,不用算这个关节点的位置,只需要知道每个关节点的旋转信息就可以了,blender根据旋转信息去转每个关节
  2. 那我就不清楚了
  3. pelvis的原点就在pelvis啊;pelvis的轴角对应整个人物全局的旋转,比如正对着,背对着等。其他23个关节点都是相对父节点的旋转信息。两个的意义是不一样的

好的我明白啦,再次感谢!