如何根据关节角度和节段长度绘制人体骨骼?

问题描述 投票:0回答:1

我正在开发一个项目,我需要仅使用片段之间的角度和这些片段的长度来表示人体骨骼。我有关于关节角度和骨头(节段)长度的详细信息。我想知道是否有一种有效的方法可以利用这些信息来绘制这个人体骨骼。

我尝试过搜索特定的库或算法来帮助我根据这些数据创建准确的人体骨骼可视化,但到目前为止,我还没有成功。我将不胜感激任何 Python 中的指导、算法建议或库。

预先感谢您提供的任何帮助!

附加信息:

我使用的分段长度是下一个:臀部到臀部、躯干、大腿、小腿、上臂、前臂和肩膀。

基于此骨架或任何其他骨架的角度:

,即如下所示的字典:

{(12, 14, 16): 168.54785591626595,
 (14, 12, 24): 172.77150681015084,
 (24, 12, 11): 54.37272304423055,
 (12, 11, 23): 117.01615512185863,
 (11, 23, 24): 108.6334963772736,
 (23, 11, 13): 45.915788777620314,
 (11, 13, 15): 177.83453548133326,
 (23, 24, 12): 79.97762545663724,
 (26, 24, 23): 163.4421588161629,
 (24, 23, 25): 145.8882059820918,
 (28, 26, 24): 103.70318526501839,
 (23, 25, 27): 178.10520631231438

以及以下线段长度(以厘米为单位):

{'hip': 20.4,
 'trunk': 49.3,
 'shoulders': 34.0,
 'forearm': 27.2,
 'upper arm': 29.409999999999997,
 'upper leg': 42.33,
 'lower leg': 42.5}

我只想绘制我尝试过的这样的骨架:

但是,我现在使用的方法并不可行,因为对于每个新姿势我都需要手动重新计算关节角度与X轴的关系(主要针对那些节段不与髋节相交的关节)。

为了方便完成任务,我假设左髋是坐标原点,并且它相对于 X 轴没有角度。

python matplotlib math geometry angle
1个回答
0
投票

你的问题很不明确。首先,如果你把你的画作移动并任意旋转,那么你的线段长度和角度不会改变。因此,除非您添加更多规格,否则您无法以独特的方式绘制它。

假设。 我猜三元组,比如

(12, 14, 16)
,表示节点 ID 的三元组。就像角度 10 一样,小腿站在 28 处,26 是膝盖,24 是臀部,见下图。此外,所有角度似乎都是按顺时针方向给出的,即角度
(a, b, c)
表示箭头“右侧”从
a
b
的角度。

然后我们可以进行以下数学观察:

观察:如果两个节点的位置已知,那么您可以绘制给定角度的第三个。

因此,您需要指定一个节点位置和第二个节点位置(通过边缘刚性连接),以便固定图形的位置和旋转。

我认为以下算法应该可以完成这项工作:

while not all nodes placed:
  if there is an angle with two nodes placed:
    place the third # can be done in a unique fashion
  else:
    # the solution is not unique and we have to place some nodes

    if there is an angle with one node placed:
      place a second one at the given distance
    else:
      # all remaining angles have no nodes placed
      pick a random angle and place a node somewhere

如果您的整个骨架可以通过以下方式进行扫描,那么至少该算法是正确的:每当放置两个节点时,都有一个角度决定第三个节点,以便节点放置以唯一指定的方式继续。

我暂时还没有检查这是否真的是您的约束产生单一刚性解决方案的充分条件。人们可以对这类问题做一些更严肃的数学计算。这是结构刚性的领域。

© www.soinside.com 2019 - 2024. All rights reserved.