微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从局部位置描述的分层骨架转换为全局坐标?

如何解决如何从局部位置描述的分层骨架转换为全局坐标?

我有一组骨骼的关节位置,其中每个关节都有一个局部位置 (x,y,z) 和一个局部旋转欧拉角。我想根据根节点将所有本地位置转换为全局位置。父层次结构定义为

parent_joint_map["Waist"] = ""
parent_joint_map["Spine"] = "Waist"
parent_joint_map["Chest"] = "Spine"
parent_joint_map["Neck"] = "Chest"
parent_joint_map["Head"] = "Neck"
parent_joint_map["Head_Tip"] = "Head"
parent_joint_map["UpperLeg L"] = "Waist"
parent_joint_map["LowerLeg L"] = "UpperLeg L"
parent_joint_map["UpperLeg R"] = "Waist"
parent_joint_map["LowerLeg R"] = "UpperLeg R"
parent_joint_map["Foot L"] = "LowerLeg L"
parent_joint_map["Foot R"] = "LowerLeg R"
parent_joint_map["Toes L"] = "Foot L"
parent_joint_map["Toes R"] = "Foot R"
parent_joint_map["Collar L"] = "Chest"
parent_joint_map["UpperArm L"] = "Collar L"
parent_joint_map["ForeArm L"] = "UpperArm L"
parent_joint_map["Hand L"] = "ForeArm L"
parent_joint_map["Collar R"] = "Chest"
parent_joint_map["UpperArm R"] = "Collar R"
parent_joint_map["ForeArm R"] = "UpperArm R"
parent_joint_map["Hand R"] = "ForeArm R"

我试图通过树进行计算并计算全局偏移量和方向,但我知道我在某处做错了数学并且对使用 3d 坐标系统不是很了解。到目前为止我的尝试是做

globalOffsetMap = {}
globalRotationMap = {}
for child in parent_joint_map:
  localPosition = positionAndRotationForJointFromCsv(data,child)[0] #local (x,z) coordinates
  localRotation = positionAndRotationForJointFromCsv(data,child)[1] #rotation matrix computed from euler angle
  if parent_joint_map[child] == "":
    globalOffsetMap[child] = localPosition
    globalRotationMap[child] = R.from_euler('xyz',(0,0),degrees=True)
  else:
    parent = parent_joint_map[child]
    parentGlobalPosition = globalOffsetMap[parent]
    parentGlobalRotation = globalRotationMap[parent]
    globalOffsetMap[child] = [x + y for x,y in zip(parentGlobalPosition,localPosition)]
    globalRotationMap[child] = parentGlobalRotation * localRotation

  globalPositionMap[child] = globalRotationMap[child].apply(globalOffsetMap[child])

但我明白这是错误的。

如果您能帮助我指明正确的方向或描述我出错的地方,我将不胜感激。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。