基本二维人形火柴人的逆运动学原理

时间:2012-08-04 09:39:30

标签: javascript math animation game-physics inverse-kinematics

我做了一些动画爱好者作为一种爱好,主要是在Javascript(基于DOM和画布)以及在C#和其他技术方面做了一些工作。然而,大部分都基于精灵,边界框,简单的像素运动等 - 现在我对使用矢量图形和实现由物理力驱动的逼真移动关节的角色感兴趣。我想在canvas元素或SVG中获得一些东西。

这里有很多关于逆运动学的问题,但是大多数都是有点低水平的,并假设先前有关向量,力和工程术语的知识。我真正欣赏的是关于如何使半髋关节,膝关节,踝关节等基本护手可以半现实地移动的基本原则的一些指示。

我经常使用Knockout.js,并且想知道我是否可以通过Knockout的计算函数实现每个关节的定位,例如膝关节的位置是根据髋关节和踝关节的位置和力来计算的。对他们进行操作。但是我很难找到一个起点:我一直在我家周围慢慢走动,就像一个疯狂的男人试图隔离人体的哪些部分实际先移动以及每个部分如何响应其他。在游戏和动画中是否有一种关于人形图形如何运动的通用方法?

请记住,我习惯使用像素坐标而不是矢量和力量,我是否天真地尝试孤立地解决这个问题?我是否会发现我还需要立即了解重心,动量和其他所有内容?

任何帮助表示赞赏,包括指向noob教程的链接!

3 个答案:

答案 0 :(得分:3)

差不多3年了,我可以为自己的问题提供各种答案。我发现了JavaScript库Physics.js和p2.js,我深入研究了他们的演示和源代码,试图学习物理心态"。简而言之,仍然是物理菜鸟 - 你通常不会明确地移动物体,而是建模一个简化的物理世界,其中物体具有基本物理属性,如质量,并且它们服从其他物体的约束,并且对作用在它们上的力作出反应,例如重力或明显的方向力,例如当脚踢球时。这使它们获得速度和角速度。该库基于由其组成的形状来处理身体质心的分辨率(例如,复杂多边形加上矩形加圆可以形成单个物理体)。各种力量和制约因素将发生冲突,图书馆在给定的时间步骤之后做出解决地点和方式的工作。物理世界,一切都应该定位。这是通过各种"解算器功能"执行与计算一样多的迭代的实现允许所需的准确性。

这两个库将其物理建模核心与可视化渲染方面分开,并允许不同的渲染实现。当我开始使用p2.js时,我看到它正在使用Pixi.js在其演示中进行渲染,所以我最终构建了自己的简单JavaScript框架,该框架基于该集成:https://github.com/TomWHall/p2Pixi我还没有构建一个这样走路的人形,但我创造了一个马戏团独轮车"带有人形图形的演示,为了简单起见,它被限制在单轮脚踏车上:http://booleanoperations.com/experiments/p2/unicycle/当骑车者左右移动时(箭头键或鼠标点击画布的任一侧),负速度或正速度应用于机动旋转车轮和车轴之间的约束,以及矫正力也应用于独轮车和骑车者的各个部分,以模拟某种形式的平衡。旋转约束适用于将骑车者的脚固定到单轮脚踏车的踏板和他的腿部一起,具有关节的旋转限制。重力保持将车轮向下拉到地面上,并且车轮的运动导致附接的腿部段随之移动。这显然与独轮车及其骑车者如何协同工作相反 - 实际上,腿部由于肌腱在骨骼上的活塞式动作而移动,并且最终导致车轮的旋转。但那是我马戏世界不必要的复杂模型: - )

答案 1 :(得分:1)

如果您正在进行更实际的游戏,通常您不会使用动态引擎对字符的平衡中心进行编码。这将是非常困难的,特别是如果你将软体和肌肉动力学结合起来,并且可能将大部分机器资源用于平衡两足动物,例如。

相反,游戏通常主要应用硬编码的角色动画,艺术家在角色走路,跑步,跳跃等时为骨架提供动画的图形和帧。这就是角色的平衡感和动作是由艺术家的触摸精心制作的,而不是广泛的物理计算的结果。

骨架基本上是一个简单的变形器。它像磁铁一样工作,以轻微的变形影响周围的顶点/像素。确定骨架对其周围角色的影响区域的过程称为蒙皮。没有什么是非常现实的:它看起来很逼真,而不是表现得很现实。它类似于3D网格:空心表面。它没有在原子和分子的层面上对事物进行建模:它看起来很逼真,而不是现实。

正向运动学然后旋转这些骨骼,使角色的一部分跟随。逆运动学是一种以IK链上具有IK目标/效应器的方式操纵这些骨骼的方法。通常你会像刚性模特一样摆出角色 - 如果你想让人体模特伸手去拿东西,你必须分别旋转他的肩膀,肘部,手腕。 IK允许您将整个手臂变成链条,并指定手腕应该去的位置,让解算器自动旋转肘部和肩部。这样你就可以把事情变成一个像人一样的东西,在那里我可以抓住某个人的手腕并拉扯它,然后手臂的其余部分就会跟随。

将艺术家驱动的传统方法作为一个坚实的基础,你有例外的是当一个角色抓住一个动态绳索时,其动作不固定,例如,并且需要坚持。当艺术家动画停止并计算出角色动作开始时。

在这种情况下,您可以使用角色的手抓住绳子作为IK目标,让他的整个身体跟随,并在每个关节/骨骼上相应地设置旋转约束,以防止他弯曲他的手臂向后打破它或将头部旋转180度驱魔风格。一个不受约束的IK解算器可能会做这些事情,所以旋转约束阻止求解器做人体无法做的事情,而你的高级游戏逻辑只是专注于移动角色的手,父对象是绳索,使用IK解算器使身体跟随。

例如,当一个角色被霰弹枪击中时,会应用类似的情况,并且你需要他用布娃娃物理学在空中飞行 - 同样的想法。

尝试让角色完全由反向运动学目标和物理学控制的游戏将是非常不寻常的。我已经看到了愚蠢的尝试,就像一个有趣的游戏,你的角色是一个酒鬼,而你的整个目标只是试图让他走回家而不是摔倒而死。

因此,除非你的整个目标和抱负是试图模拟像人体一样复杂的东西的动态,我建议从传统的艺术家驱动的方法开始,并谨慎地使用这些动态对你的角色。这也是3D包装的表现方式,其中大部分角色都是艺术家的关键帧,但某些部分在某些时候可能部分通过动态来计算,如头发的移动。

也许你可以通过自己的方式向上计算越来越多的自动计算,让艺术家手动做得越来越少。但是,我不会从试图将其全部自动化的方法开始,特别是除非你是动力学和反向运动学概念的主人。

答案 2 :(得分:0)

  

请记住,我习惯使用像素坐标而不是矢量和力量,我是否天真地尝试孤立地解决这个问题?我是否会发现我还需要立即了解重心,动量和其他所有内容?

简而言之,是的。我并不想让人沮丧,但如果你至少不了解IK背后的一些数学知识,那么即使适当的库的API也会让你感到困惑。如果你先做一些学习,你会有更少的挫败感。到那时,您应该对模型的结束位置以及模型的开始位置有一些了解。