外文翻译 程序性动画——触手的逆向运动学

105
回复
20783
查看
打印 上一主题 下一主题
  [ 复制链接 ]
排名
10706
昨日变化

13

主题

166

帖子

486

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
70381
好友
8
蛮牛币
523
威望
0
注册时间
2015-1-22
在线时间
193 小时
最后登录
2019-7-28

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 小妞牛 于 2017-11-2 11:12 编辑

触手的逆向运动学

这篇文章继续我们深入逆向运动学的旅程。你将学到怎样应用这个有力的技术来创造富有真实感的触手方法。





你可以从这里找到此系列所有的章节:
Part 7:蜘蛛腿的逆向运动学

在帖子的底端你都可以找到一个链接来下载所有必要的资源和场景来再现这些教程。

前言

在教程的前一章“机械手臂的逆向运动学”中,我们讨论了在机械手臂上怎样使用梯度下降来完成逆向运动学。这种由机械完成的运动,比复杂的人体关节简单得多。对于一个机械手臂而言,每个关节都由一个发动机控制。同理,对于一个生物手臂来讲,每块肌肉都是一个可以自行收缩和扩张的独立马达。

一些生物具备几个可以到达任意角度的关节,例如大象的鼻子、章鱼的触手等。将这些肢干模型化是一种挺特别的挑战,目前介绍的这些传统技术并不能产生非常真实的效果。

我们将从前一篇文章的例子开始,继续挑战,直到我们获得模型足够真实的行为为止。

触手绑定骨骼

当我们创建一个机械手臂之后,每个部分都是可独立移动的。相对而言,触手可以弯曲。这是一个我们无法忽略的基本特征,如果我们想要让它看起来真实的话。我们的触手需要能够弯曲。

一个可以允许这个基本特征的Unity组件叫做“Skinned Mesh Renderer”:



然而,Unity并不提供从编辑器创建Skinned Mesh Renderer的方法。一款3D建模软件,比如说Blender,此时就被需要了。下图展示了余下教程中将被使用的触手模型,里面有一系列明显的Bones骨骼),一个接着一个。它们是允许模型弯曲的Objects。



给模型加骨骼,也称为绑定Rigging),已经超出了本教程的范围。下面链接提供了比较好的骨骼绑定说明。(网址如下:https://en.wikibooks.org/wiki/Blender_3D:_Noob_to_Pro/Bones)

骨骼和关节

给予触手逆向运动学的下一步是为每一个骨骼挂载一个RobotJoint脚本。通过这么做,我们赋予了我们的逆向运动学求解器一个使触手弯曲的能力。

对于普通的章鱼来说,每个“关节”都能够沿着它自身的三个轴向,自由的旋转。在“机械手臂的逆向运动学”中设计的代码,很可惜,只允许关节沿着单个轴向移动。改变这个代码对于已有脚本而言,将意味着把它们引入了一个新的复杂等级。反过来说,我们可以转动关节的轴向,使关节0转向X轴、关节1转向Y轴、关节2转向Z轴等等。这会导致不自然的行为,但是如果骨骼足够小,你就有可能不会感到有任何问题

在随教程附带的可下载Unity工程文件中,这个名为SetRobotJointWeights的脚本会自动初始化触手所有关节的参数。或者,你也可以为了更好的控制每个骨骼的移动方式而自己来编写脚本。

缓和功能

下面的动画展示了两个触手。左边的那个抵着红色球体的触手使用的是“机械手臂的逆向运动学”中提出的算法,与之相反,右边的那个通过一个更加有机化的螺旋式运动来增加一个真实化的新扭曲。这个例子已经足够让我们明白为什么触手需要一个单独的教程。



两个触手都依赖梯度下降,不同之处在于它们试图最小化的误差函数。左边的机械触手只想碰到球,并不关心任何其他参数。一旦末梢执行器碰到了球,聚合度被满足,然后触手就会停止移动。

另一方面,右边的触手,正在最小化不同的函数。用于机械手臂的DistanceFromTarget类被一个新的更复杂的类替代了。我们能设计一个新的误差函数类来关注其他几个我们关心的参数。教程中展示的触手试着最小化三个不同的函数:

1.与目标的距离:已经定义好了。

2.末梢执行器的角度:在这条中,触手试着匹配我们想让物体达到的角度。这种行为能被看做上述动画,就是右侧触手围着球体螺旋式运动的样子。自从每个关节都有了一个移动的极限范围之后,这个范围限制将引发沿着骨骼链传播的连锁反应。我们可以强迫触手匹配物体试图达到的角度,通过这么做,我们可以测量末梢执行器和目标转角之间的角度。Unity有可以实现这项功能的便利函数:Quaternion.Angle

[C#] 纯文本查看 复制代码
float rotationPenalty =
    Mathf.Abs
    (
         Quaternion.Angle(EndEffector.rotation, Destination.rotation) / 180f
    );


像这样匹配本地角度,可能并不总是个好主意。根据情况,你可能想让你的触手用不同的方式对齐。

3.扭曲:让肢干保持在一个不自然的位置看起来是十分不舒服的。这个参数使盘绕方案处于非常不利的境地,强制逆向运动学更线性、简单的旋转。为了计算扭曲的惩罚,我们首先要定义在我们的环境中什么是“扭曲”。定义它最简单的方法是作为所有关节角度的平均值。这种想让触手保持放松状态的惩罚方案,要求许多扭曲。

[C#] 纯文本查看 复制代码
float torsionPenalty = 0;
for (int i = 0; i < solution.Length; i++)
     torsionPenalty += Mathf.Abs(solution);
torsionPenalty /= solution.Length;


这三种惩罚分数导致触手以更加真实的方式移动。更复杂的版本能确保它们即使当其他限制被完全满足时也保持晃动。

注意1:使用不同单位
那三个参数更有可能在不同的单位被表达。

当末梢执行器旋转的单位是角度时,与目标之间的距离可能是米。根据它们的价值重新测量它们很重要,便于不再衡量10度和距离目标10米的不同。
理想中,0和1之间应该被标准化。然后,可以使用系数来确定它们的相对重要性:

[C#] 纯文本查看 复制代码
public float ErrorFunction (Vector3 target, float [] angles)
{
    return
        NormalisedDistance(target, angles) * DistanceWeight +
        NormalisedRotation(target, angles) * RotationWeight +
        NormalisedTorsion (target, angles) * TorsionWeight  ;
}


这个方法也给触手的良好行为提供了好的控制。它们可以根据情况随时被改变,以此来改变触手的移动方式。例如,你可以增加TorsionWeight类来解开触手凌乱的纠结。

注意2:我们没有分析定义!

正向运动学的典型性问题可以被模型化分析。这意味着我们可以展示一个问题并解决它。我们已经提到过了‘解决逆向运动学对偶问题的分析方法’的存在。

我们现在说的是一个函数,是一个可能的,不能被解析描述的一个函数。如果我们必须选择使用典型的可分析的方法来解决逆向运动学,我们就不能给我们的触手增加那些细微的差别了。使用梯度下降意味着我们几乎能够最小化任何随机函数,无论我们是否拥有它的方程式。

扩展

我们能做的改进扩展几乎没有限制。减速函数能够增加你触手的真实性,当触手越靠近目标时,触手就应该越慢。

同样的,触手不应该碰到自己。为了避免这个,可以给每个关节上加上精准碰撞器。然而,这会导致触手离奇的行为。代码忽略了碰撞,可能仍然会收敛一个发生自碰撞的方案。一个解决方法是修改适应函数(fitness function)便于自相交方案被高度处罚。




你可以从这里下载Unity项目工程:https://www.patreon.com/posts/8928832
从这里可以下载机械手臂的3D模型:https://3dwarehouse.sketchup.com/model/92e064854f4dd504c8ab9067fbd9681d/Robotic-Arm-stainless-steel-R6Stainless
从这里可以下载触手(带骨骼)模型:https://sketchfab.com/models/8fcc783af94246a0b8febf424a4b96b9#download

原文作者:Alan Zucconi
原文链接:https://www.alanzucconi.com/2017/04/12/tentacles/


扫描下方二维码关注游戏蛮牛官方微信~每日都有精选干货与你分享呦~

本文由蛮牛译馆倾情奉献,翻译:小妞牛,如有问题请及时联系,除合作社区 及 合作媒体 外,禁止转载!

参与人数 1鲜花 +1 收起 理由
yfrjxy + 1 赞一个!

查看全部评分总评分 : 鲜花 +1

6蛮牛粉丝
1021/1500
排名
3170
昨日变化

7

主题

281

帖子

1021

积分

Rank: 6Rank: 6Rank: 6

UID
64688
好友
0
蛮牛币
1174
威望
0
注册时间
2014-12-30
在线时间
265 小时
最后登录
2019-8-12
沙发
2017-11-2 17:13:06 只看该作者
很不错的应用,先Mark一个,到时应该用得着。。
5熟悉之中
765/1000
排名
5365
昨日变化

20

主题

350

帖子

765

积分

Rank: 5Rank: 5

UID
249218
好友
3
蛮牛币
2772
威望
0
注册时间
2017-10-17
在线时间
121 小时
最后登录
2019-7-3
板凳
2017-11-3 08:31:39 只看该作者
很不错  很实用 谢谢楼主分享

点评

新手有点懵,不过感觉很Nice!  发表于 2018-10-29 23:26
3偶尔光临
281/300
排名
8916
昨日变化

3

主题

58

帖子

281

积分

Rank: 3Rank: 3Rank: 3

UID
245484
好友
0
蛮牛币
610
威望
0
注册时间
2017-9-22
在线时间
88 小时
最后登录
2018-5-11
地板
2017-11-3 08:44:42 只看该作者
6666666666666666
7日久生情
3834/5000
排名
489
昨日变化

10

主题

343

帖子

3834

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
22945
好友
1
蛮牛币
4161
威望
0
注册时间
2014-4-26
在线时间
2023 小时
最后登录
2019-8-20
5#
2017-11-3 09:05:05 只看该作者
能提供工程最好了 ~ ~
7日久生情
1787/5000
排名
1203
昨日变化

1

主题

176

帖子

1787

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
132507
好友
0
蛮牛币
2975
威望
0
注册时间
2015-12-24
在线时间
626 小时
最后登录
2019-8-19
6#
2017-11-3 10:11:04 只看该作者
感觉吊吊的,有时间看看
7日久生情
4405/5000
排名
2320
昨日变化

5

主题

3109

帖子

4405

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
209186
好友
5
蛮牛币
1171
威望
0
注册时间
2017-3-1
在线时间
679 小时
最后登录
2019-8-20
7#
2017-11-3 11:21:27 只看该作者
好腻害,谢谢分享
7日久生情
1531/5000
排名
1788
昨日变化

0

主题

474

帖子

1531

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
170014
好友
0
蛮牛币
5671
威望
0
注册时间
2016-9-21
在线时间
317 小时
最后登录
2018-7-21
QQ
8#
2017-11-3 12:16:31 只看该作者
好邪恶
7日久生情
2398/5000
排名
1542
昨日变化

53

主题

829

帖子

2398

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
219600
好友
7
蛮牛币
3329
威望
0
注册时间
2017-4-27
在线时间
690 小时
最后登录
2019-7-19
9#
2017-11-3 12:31:12 只看该作者
感谢分享,学习了
排名
19948
昨日变化

0

主题

18

帖子

82

积分

Rank: 2Rank: 2

UID
226555
好友
0
蛮牛币
104
威望
0
注册时间
2017-6-13
在线时间
36 小时
最后登录
2019-8-20
10#
2017-11-3 17:59:51 只看该作者
6666666666666666
5熟悉之中
557/1000
排名
5262
昨日变化

0

主题

48

帖子

557

积分

Rank: 5Rank: 5

UID
148615
好友
0
蛮牛币
888
威望
0
注册时间
2016-5-15
在线时间
239 小时
最后登录
2018-4-5
11#
2017-11-4 16:54:09 只看该作者
厉害了好触手。。。
6蛮牛粉丝
1296/1500
排名
1469
昨日变化

0

主题

51

帖子

1296

积分

Rank: 6Rank: 6Rank: 6

UID
178205
好友
0
蛮牛币
4102
威望
0
注册时间
2016-10-25
在线时间
383 小时
最后登录
2019-7-16
12#
2017-11-6 17:14:45 只看该作者
牛批牛批牛批牛批牛批牛批牛批牛批牛批牛批
7日久生情
1909/5000
排名
971
昨日变化

7

主题

259

帖子

1909

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
20039
好友
3
蛮牛币
6342
威望
0
注册时间
2014-4-2
在线时间
543 小时
最后登录
2019-8-13
QQ
13#
2017-11-6 17:15:41 只看该作者
66666666  不明觉厉~!
6蛮牛粉丝
1296/1500
排名
1469
昨日变化

0

主题

51

帖子

1296

积分

Rank: 6Rank: 6Rank: 6

UID
178205
好友
0
蛮牛币
4102
威望
0
注册时间
2016-10-25
在线时间
383 小时
最后登录
2019-7-16
14#
2017-11-6 17:16:22 只看该作者
很不错  很实用 谢谢楼主分享
3偶尔光临
231/300
排名
12305
昨日变化

0

主题

71

帖子

231

积分

Rank: 3Rank: 3Rank: 3

UID
3758
好友
0
蛮牛币
1284
威望
0
注册时间
2013-9-12
在线时间
84 小时
最后登录
2019-2-22
15#
2017-11-7 09:49:38 只看该作者
好腻害,谢谢分享
您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则