查看原文
其他

程序丨计算机图形学流行工具介绍:逆向运动学综述

2017-11-21 刘超 Gad-腾讯游戏开发者平台

译者:刘超(君临天下)

审校:梁君(君儿)


你可能听说过逆向运动学(Inverse Kinematics, IK)。IK是Unity以及计算机图形学中的一个十分流行的工具。但是如果这是你第一次尝试创建或者使用逆向运动学系统,那么你可能想要了解更多的细节。在本文,我将会解释IK是什么,对它进行定义并对它的使用方法进行介绍。


有哪些在理解IK方面必须要掌握的词汇?


在我们开始真正了解IK的核心之前,我们需要定义一些与IK相关的词汇。IK是一种应用于铰链连接体(Articulated Body)的方法。那么什么是铰链连接体呢?


铰链连接体(Articulated Body)


一个铰链连接体能够表达大多数的可以运动的物体,例如人类或者动物的骨骼。简而言之,一个铰链连接体是一个由许多连在一起的铰链组成的树。这些连接的铰链由运动副和构件组成,其中每一个构件都是一个圆柱形的刚体。图1展示了一个使用铰链连接体表达的人体骨骼。


图 1: 人体骨骼铰链连接体


尽管封面图上一个简单的玩具代表了一个铰链连接体。但是它缺少了肘关节和膝关节。


运动副的类型


对于运动副,包含两种类型。第一种类型的运动副是旋转副。它连接到一个可以旋转的关节上。如图2所示展示了一个旋转副。


图 2: 旋转副


旋转副非常类似于时钟的表心——以时钟的指针作为关节。


时钟金色的表心是一个旋转副.


移动副是一种可以延伸或者缩短被连接的关节的运动副. 如图3所示展示了一个移动副。


图 3: 移动副


移动副的运动更像是你的行李箱上的可以伸缩的拉杆。如果你仔细的观察,可伸缩的行李箱拉杆有4个移动副。其中有2个移动副有一半位于拉杆的下方,另外2个移动副的所有的部分位于行李箱顶部的拉杆之上。


红色的四个箭头表示出了行李箱拉杆上的四个移动副


如果你对移动副的理解有一些迷惑,请不要担心。它们在逆向运动学中并不经常使用到,正如你可能会说到的那样,没有一个人的构成具有移动副——他们仅包含旋转副。


层次结构



对于每一个铰链连接体都有一个根部运动副(root joint)。该根部运动副是整个结构的基础。对于人体形状来讲,根部运动副通常位于臀部的中心。铰链连接体是由一个运动副关节树来构成的,一般从根部运动副开始。每一个新的运动副或者新的关节类似于树上的一个新的分支。一个内部关节/运动副是指的在该铰链连接体的树状结构中更靠近根部运动副的那些关节/运动副,由于它和给定的关节/运动副更加关系密切。一个外部关节/运动副是指的在该铰链连接体的树状结构中远离根部运动副的那些关节/运动副。在图4中,运动副A是根部运动副,关节1是运动副B的内部关节,而关节2是运动副B的外部关节。


末端执行器


末端执行器位于最外侧的关节的最外侧的位置。它是交替连接的运动副和关节中能够自由移动的终端。然而,末端执行器并非是一个运动副。末端执行器仅仅是一个位于铰链连接体的末端的东西。一个铰链连接体可以有多个末端执行器,就像是一个二叉树可以有很多个叶子节点一样。


图 4: 图中绿色部分表示一个末端执行器


衔接和位置(Articulationsand Poses)


衔接指的是移动一个互相连接的关节来实现运动副的旋转或者平移。例如,在图5中,运动副A是一个角度为45°的衔接,运动副B是一个角度为15°的衔接,运动副C是一个角度为-60°的衔接。另一方面,位置是一些运动副衔接的组合用来定位铰链连接体。换句话说,位置是一个向量而不是一个标量。例如,在图4中,该铰链连接体的位置是<45°,15°,-60°>。


图 5: A作为根部运动副的铰链连接体


什么是前向运动学?


在我们开始进行逆向运动学的学习之前,我们首先需要弄清楚什么是前向运动学。前向运动学的函数/算法是将关节的位置作为输入,来计算末端执行器的位置作为输出。前向运动学是逆向运动学的反函数。使用前向运动学,你需要定义铰链连接体的所有的整体姿态作为输入用于提供给函数/算法。这意味着,你需要定义铰链连接体上的每一个运动副的衔接关系。如果运动副数量较少,这可能是没有问题的,但是当运动副的数目变多时,这往往变得非常乏味。


什么是逆向运动学?


现在,假想一下如果你想要你的铰链连接体的末端执行器到达一个指定的目标位置。这意味着你要知道你要到达的目标的末端执行器的位置,但是你并不知道为了让末端执行器到达该位置应该具有什么样的铰链连接体的位置。这就是逆向运动学发挥作用的地方。


图 6: 目标位置使用红色圆圈进行表示,目标位置被定义为输入,计算位置作为输出用于末端执行到达目标位置。


逆向运动学是前向运动学的逆函数/算法。前向运动学函数/算法将目标位置作为输入,并且计算所需的位置用于末端执行器到达目标位置——该位置作为输出。


正如你所见,输入和输出是在FK和IK之间进行切换。对于逆向运动学,你不需要定义铰链连接体的整个位置——这些可以通过逆向运动学计算而得到。使用IK,你只需要定义一个位置作为输入。


逆向运动学在计算位置时完成了所有的具有挑战性的计算工作。图6很好的进行了阐述。在前一个场景中,具有一个铰链连接体和一些已知的位置。它定义了末端执行器想要到达的目标位置。一旦IK算法应用于铰链连接体,我们可以得到接下来的场景。下面的场景展示了一个计算得到的新的位置,这使得末端执行器现在位于目标位置。


IK有哪些用处?


对于这一点,我们知道IK适用于铰链连接体,我们了解了一个铰链连接体是由哪些部分组成的,以及我们知道了IK和FK之间的不同之处。到目前为止,我们对IK有了一个很好的概述,但是我们还要介绍关于IK的非常实用的例子。IK可以被用于模仿人类的手臂来移动至一个目标或者对象,正如我们所见到的一样。IK同样也可以用于脚步,这样我们可以告诉脚应该走到哪里,然后IK将会计算出如何对脚的运动副进行配置。IK通常不被用于动画本身(到达一个目标位置),但是更多的是用于动画工具。因此,如果你正在实现一个行走的循环,那么你可以通过使用IK来创建一些动画的关键帧。


图 7: IK用于脚的旋转作为目标。运动副L和R进行旋转使得符合倾斜面


关于IK的另一个关键点是你的目标不仅局限于位置本身——你的目标也可以被定义为旋转。例如,如果你的脚需要根据不平坦的地面进行旋转,那么你的IK旋转目标可以基于地面法线进行定义。如图7所示,这样就会使得你的脚符合倾斜平面。请注意,你也可以使用IK来使得你的头(或者眼睛)朝向某一个方向。如果你想要你的头部跟随者某一个对象,你可以使用IK让你的头部跟随者该物体。


IK 示例


我将会展示一些IK的示例来完成这篇文章。这个角色通过移动IK的目标位置来实现左手和右腿的移动。


Unity3D中的IK示例


我想要感谢计算机图形学硕士Eric Haines, Ed Angel, 和RickParent 对本文非常重要的反馈。


【版权声明】

原文作者未做权利声明,视为共享知识产权进入公共领域,自动获得授权。


----------------------

今日推荐


ET开源服务器框架跨平台部署Centos7

细剖!被称为像素艺术的HQX缩放过滤器

腾讯技术专家答疑专场:游戏中的人工智能


添加小编微信,可享双重福利

1.加入GAD程序猿交流基地

获取行业干货资讯,观看大牛分享直播

2.领取60G独家程序资料,地址在小编朋友圈

包括腾讯内部分享、文章教程、视频教程等全套资料

↓长按添加小编GAD苏苏↓

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存