【问题标题】:Principles of inverse kinematics for a basic 2D humanoid stickman基本二维人形火柴人的逆运动学原理
【发布时间】:2012-08-02 04:47:32
【问题描述】:

我的业余爱好是做一些极客动画,主要是在 Javascript(基于 DOM 和画布)方面,以及在 C# 和其他技术方面做过一些工作。然而,其中大部分都是基于精灵、边界框、简单的像素移动等——现在我对使用矢量图形和实现一个由物理力驱动的具有逼真的移动关节的角色感兴趣。我想在画布元素或 SVG 中添加一些东西。

这里有很多与逆运动学相关的问题,但大多数问题都比较低级,并且需要先了解矢量、力和工程术语。我真正欣赏的是一些关于如何使具有髋关节、膝关节、踝关节等基本火柴人的基本原理背后的基本原则的一些指示。

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

考虑到我习惯于使用像素坐标而不是矢量和力,我是否天真地试图孤立地解决这个问题?我会发现我还需要立即了解重心、动量和所有其他知识吗?

感谢任何帮助,包括新手教程的链接!

【问题讨论】:

  • 如果您想深入了解逆运动学算法,我建议您从 FABRIK 开始——它是实现和直观理解的最直观、最简单的 IK 形式。然后你可以按照自己的方式升级到 CCD 等等。
  • 从您的问题来看,听起来您最好从对正向运动学的基本了解开始。它所涉及的只是一个基本的养育方式——比如如果父母移动 X 10 个单位,那么孩子应该跟着它移动。如果它旋转 90 度,孩子也应该沿着父母的枢轴旋转 90 度。它归结为级联变换,这就是矩阵和线性代数甚至四元数发挥作用的地方,但你可以不使用它们,特别是如果你只是在没有万向节锁定等问题的 2D 环境中工作。

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


【解决方案1】:

考虑到我习惯于使用像素坐标而不是矢量和力,我是否天真地试图孤立地解决这个问题?我会发现我还需要立即了解重心、动量和所有其他知识吗?

简而言之,是的。我并不是要气馁,但是如果您至少不了解 IK 背后的一些数学知识,那么即使是相应库的 API 也会让您感到困惑。如果你先做一些学习,你会减少挫折感。到那时,您应该对模型的结束位置和模型的渲染开始位置有一定的了解。

【讨论】:

  • 很公平。鉴于近 4 个月以来没有答案,我怀疑您是对的,并且不能脱离背景知识来回答。我会尽量在我忙碌的极客日程中增加一些技能。
【解决方案2】:

如果您正在开发一种更实用的游戏,通常不会使用动态引擎对角色的平衡中心等内容进行编码。这将是极其困难的,特别是如果您要结合柔软的身体和肌肉动力学,并且可能会将机器的大部分资源用于平衡两足动物,例如

相反,游戏通常主要采用硬编码类型的角色动画,当角色行走、奔跑、跳跃等时,艺术家为骨架提供图形和动画帧。角色的平衡感和运动感都经过仔细考虑由艺术家的触觉而不是大量物理计算的结果制成。

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

然后,前向运动学会旋转这些骨骼,使角色的某些部分跟随。反向运动学是一种以 IK 链上具有 IK 目标/效应器的方式操纵这些骨骼的方法。通常你把角色摆成一个僵硬的人体模型——如果你想让一个人体模型伸手去拿东西,你必须分别旋转他的肩膀、肘部和手腕。 IK 让您可以将整个手臂变成一条链,只需指定手腕的位置,让解算器自动旋转肘部和肩部。这使您可以摆出更像人类的姿势,我可以抓住某人的手腕并拉扯它,然后他们的手臂的其余部分随之而来。

以艺术家驱动的传统方法作为坚实的基础,但有例外的情况是,角色抓住动态绳索,其动作不固定,例如,需要紧紧抓住。这就是艺术家动画停止并开始计算角色动作的时候。

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

当一个角色被霰弹枪击中时,类似的情况也适用,你需要他用布娃娃物理原理在空中飞行——同样的想法。

尝试让角色完全由反向运动学目标和物理控制的游戏是非常不寻常的。我见过一些愚蠢的尝试,比如一个有趣的游戏,你的角色是个酒鬼,你的全部目标只是试图让他走回家,而不是摔倒而死。

因此,除非您的全部目标和抱负是尝试模拟人体等复杂物体的动态,否则我建议您从传统的艺术家驱动方法开始,并谨慎地在角色上使用这些动态。这也是 3D 包的做法,其中大部分角色由艺术家设定关键帧,但有时某些部分可能部分由动态计算,如头发的移动。

也许您可以逐步提高计算的自动化程度,让艺术家的手动操作越来越少。但是,我不会从尝试将其全部自动化的方法开始,尤其是除非您精通动力学和逆运动学概念。

【讨论】:

  • 非常感谢您的深入解答。它启发了我添加我自己的答案,作为我到达的地方的更新。
【解决方案3】:

将近 3 年过去了,我可以为自己的问题提供各种各样的答案。我发现了 JavaScript 库 Physics.js 和 p2.js,并深入研究了它们的演示和源代码,以尝试学习“物理思维方式”。简而言之,仍然作为物理学新手说话 - 您通常不会显式移动对象,而是建模一个简化的物理世界,其中物体具有基本的物理属性,例如质量,它们服从其他物体的约束,并对作用在它们上的力,例如重力或明确的方向力,例如脚踢球时。这使它们达到速度和角速度。该库根据物体所包含的形状(例如,一个复杂的多边形加上一个矩形加上一个圆可能形成一个单一的物理体)来处理物体质心的分辨率。发挥作用的各种力和约束将处于各种冲突中,图书馆负责解决在物理世界的给定“时间步长”之后应在何处以及如何定位所有内容的工作。这是通过各种“求解器函数”实现来完成的,这些实现在计算允许所需的精度时执行尽可能多的迭代。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多