[Silverlight动画]转向行为 - 介绍

转向行为(steering behaviors)这一术语,指的是一系列使对象行动起来像似长有智商的算法。这些行为都归于人工智能或人工生命一类,是让对象呈现出拥有生命一般,对如何移动到目的地、捕捉或逃避其它对象、避开障碍物、寻求路径等做出因地适宜的决定。

介绍行为,了解行为,展示一个实现这些行为的框架。一些行为根据复杂度不同,实现起来有多种不同方式。所有行为都不存在一个标准或者正确的做法,实现上给出的也是很简单的样式。换句话说,仅从介绍和展示的角度去考虑实现。要是用于产品开发的话,提供的代码需要根据要求做大量调整。

行为

首先,预览一下几个基本行为,看看它们是什么,要干什么。

寻找(seek):角色试图移动到一个指定点。该点可以是一个固定点也可以是把另一个角色作为目标的移动点。

避开(flee):与寻找正好相反。角色试图避开一个给定点。同样,这个点也可以是固定点或者移动点。

到达(arrive):和寻找相同,除了角色的速度在接近目的地时会减慢,最终以一个渐变运动恰好停留在目标处。

追捕(pursue):寻找的加强版。由于目标会做加速运动,所以角色会事先预测然后再移动到该点。很明显,由于固定点是不会有速度概念的,所以这里用目标代替点的概念。

躲避(evade):与追捕正好相反。角色对目标的速度做出预测,然后尽可能躲避开来。

漫游(wander):随机但平滑又真实的运动。

对象回避(object avoidance):角色预测出对象的行动路径,然后避开他们。

路径跟随(path following):角色尽可能的沿着自己的路径移动,但要考虑符合一些真实的物理现象,以及使用其它行为后的影响。

除了这些行为,还有复杂的类似鸟群这样的复合行为,它大致上由以下三种简易行为合成:

分离(separation):鸟群中每个角色都试着和相邻角色保持一定的距离。

凝聚(cohesion):每个角色尽量不掉队,不落下太远。

队列(alignment):每个角色尽可能与相邻角色行动于同一方向。

虽然是三个相对简单的行为,但合在一起时就能产生出难以想象的群体效果,像鸟群或是其它生物群体。调整这三个行为中的各个参数会改变群体的性质,有经常分散的松散型队伍,有紧密的小团体,还有有一个带头的率领着的队伍,等等多种变化。

在让对象按照行为行动起来之前,首先要有一个能让它们动起来的方法。

2D向量(Vector2D)类

转向行为已经被各种语言实现过多次了,其最底层是用向量来描述的(也是最常见的实现方式)。

概括的看,一个向量由两部分组成:一个方向和一个大小。比如,一个运动中对象的速度由它要去哪里(方向)和移动快慢(大小)两部分组成。因此,把速度看作一 个向量是最贴切不过的。加速度——任何改变对象速度的作用力——同样也是由力的方向和大小组成(另一个向量)。向量同样也可以用来描述对象间的位置关系, 其中大小代表距离,方向代表角度。

向量还可以用来表示一个角色(脸)的朝向,这种情况下就只管方向,而忽视大小,也可以说大小等于1。这样的向量叫做单位向量(unit vector)。实际上,只有一单位长度的向量,在数学运算上能起到很大的优化作用。

向量的所有这些特性对转向行为来说都很有用,因为速度,队伍方向,对象间距离,对象的朝向都会被大量的使用。

【代码】

对于实现这样的类,在架构上就存在着挑战,比如决定类的方法该如何工作。对这些方法truncate,normalize,reverse,add,substrat,multiple和divide有两种考虑情况:是直接对调用对象做改变呢,还是返回一个新的对象。

举个例子,假设有vectorA(3,2)意思是x等于3,y等于2,和vectorB等于(4,5),然后执行以下代码:

vectorA.add(vectorB);

根据第一种情况,vectorB不变,而vectorA等于(7,7)。

而另一种情况,vectorA和vectorB都不变,但是产生一个新的等于(7,7)的向量,我们让它等于vectorC。

vectorC = vectorA.add(vectorB);

那么哪种做法才合适呢?对此,我前前后后进行了多番审视,最终发现在很多数学运算时,需要把一个对象——比如位置和速度——用向量来表示,而无所谓运算后对象本身的改变。所以,加、减、乘、除不对原对象进行修改。

然而truncate(截断),reverse(倒置)和normalize(单位化)则更注重对象本身的改变,所以这些操作用来直接改变对象要比返回一个新的更有用。

互换以上操作方式也不是很难。如果想把vectorB加在vectorA上,可以这样:

vectorA = vectorA.add(vectorB);

而如果想让normalize返回一个新的对象,可以使用clone(克隆)函数:

normalizedA = vectorA.clone().normalize();

现在,有了向量类可以表示角色的位置,速度和各种群体。还需要一个类用来表示角色。

转向行为(steering behaviors)这一术语,指的是一系列使对象行动起来像似长有智商的算法。这些行为都归于人工智能或人工生命一类,是让对象呈现出拥有生命一般,对如何移动到目的地、捕捉或逃避其它对象、避开障碍物、寻求路径等做出因地适宜的决定。介绍行为,了解行为,展示一个实现这些行为的框架。一些行为根据复杂度不同,实现起来有多种不同方式。所有行为都不存在一个标准或者正确的做法,实现上给出的也是很简单的样式。换句话说,仅从介绍和展示的角度去考虑实现。

行为 首先,预览一下几个基本行为,看看它们是什么,要干什么。

  • 寻找(seek):角色试图移动到一个指定点。该点可以是一个固定点也可以是把另一个角色作为目标的移动点。
  • 避开(flee):与寻找正好相反。角色试图避开一个给定点。同样,这个点也可以是固定点或者移动点。
  • 到达(arrive):和寻找相同,除了角色的速度在接近目的地时会减慢,最终以一个渐变运动恰好停留在目标处。
  • 追捕(pursue):寻找的加强版。由于目标会做加速运动,所以角色会事先预测然后再移动到该点。很明显,由于固定点是不会有速度概念的,所以这里用目标代替点的概念。
  • 躲避(evade):与追捕正好相反。角色对目标的速度做出预测,然后尽可能躲避开来。
  • 漫游(wander):随机但平滑又真实的运动。
  • 对象回避(object avoidance):角色预测出对象的行动路径,然后避开他们。
  • 路径跟随(path following):角色尽可能的沿着自己的路径移动,但要考虑符合一些真实的物理现象,以及使用其它行为后的影响。
  • 除了这些行为,还有复杂的类似鸟群这样的复合行为,它大致上由以下三种简易行为合成:
  • 分离(separation):鸟群中每个角色都试着和相邻角色保持一定的距离。
  • 凝聚(cohesion):每个角色尽量不掉队,不落下太远。
  • 队列(alignment):每个角色尽可能与相邻角色行动于同一方向。

虽然是三个相对简单的行为,但合在一起时就能产生出难以想象的群体效果,像鸟群或是其它生物群体。调整这三个行为中的各个参数会改变群体的性质,有经常分散的松散型队伍,有紧密的小团体,还有有一个带头的率领着的队伍,等等多种变化。

在让对象按照行为行动起来之前,首先要有一个能让它们动起来的方法。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据结构与算法

博弈论进阶之SG函数

SG函数 个人理解:SG函数是人们在研究博弈论的道路上迈出的重要一步,它把许多杂乱无章的博弈游戏通过某种规则结合在了一起,使得一类普遍的博弈问题得到了解决。 从...

3995
来自专栏算法channel

AI 路上,第一步这么走下去...

算法是描述解决一个问题的步骤,外界给它所指定的数据,然后经过一系列步骤输出一个结果。为了更快更轻量级地解决问题,我们会选择高效精简的结构去实现,这种结构称为数据...

1256
来自专栏C语言及其他语言

【每日一题】问题 1429[蓝桥杯][历届试题]兰顿蚂蚁

题目描述 ? 兰顿蚂蚁,是于1986年,由克里斯·兰顿提出来的,属于细胞自动机的一种。 平面上的正方形格子被填上黑色或白色。在其中一格正方形内有...

2896
来自专栏数据派THU

教你用Python进行自然语言处理(附代码)

3688
来自专栏苦逼的码农

循序渐进带你学习时间复杂度和空间复杂度。

写了这么久的算法文章,可以说凡是算法的文章都会涉及到时间复杂度和空间复杂度,可能有些读者对时间复杂度和空间复杂度还有点迷糊,今天特地找了一篇关于时间复杂度和空间...

1094
来自专栏hadoop学习笔记

Hanlp自然语言处理工具的使用演练

Hanlp是由一系列模型与算法组成的工具包,目标是普及自然语言处理在生产环境中的应用。Hanlp具备功能完善、性能高效、架构清洗、语料时新、可自定义的特点;提供...

1992
来自专栏C语言及其他语言

[每日一题]矩阵转置(1242)

题目描述 输入N*N的矩阵,输出它的转置矩阵。 输入 第一行为整数N。 接着是一个N*N的矩阵。 输出 转置矩阵 样例输入 2 1 2 1 2 样例输出 1 ...

3479
来自专栏新智元

邓侃:谷歌Talk to books引爆搜索方式革命

?---- 【新智元导读】昨天,新智元介绍了谷歌的全新搜索工具“Talk to Books”,基于自然语言文本理解,用户能够凭语义而非关键词来实现搜索功能。谷歌...

2926
来自专栏我和未来有约会

[Silverlight动画]转向行为 - 群落

说到群落,很难不引用Craig Reynolds和他的"boilds"模拟系统。Reynolds很牛的将一个看似非常恐怖的复杂过程,拆成了几个比较简单的行为。 ...

2238
来自专栏ACM算法日常

5行位运算,map靠边站——位操作进阶

Given an array of integers, every element appears three times except for one. F...

1171

扫码关注云+社区

领取腾讯云代金券