ai seek
原文地址链接:http://gamedevelopment.tutsplus.com/tutorials/understanding-steering-behaviors-seek--gamedev-849
位置,速度和移动
在行为控制中的所有的算法实现都是通过数学上的向量计算来实现的。由于这个控制会改变人物的速度和位置,所以同样的我们也可以使用向量来表示这些属性。
虽然向量拥有一个方向,但是当用向量来表示一个位置的时候,我们往往可以忽略它的方向:

上面的图中P向量表示的是一个点(x,y),V向量表示的是一个速度(a,b),我们可以通过欧拉积分的方法来计算人物新的位置:
position = position + velocity ;
速度向量的方向控制了一个人物将要向哪个方向移动,速度向量的大小控制了人物每一帧将会移动多少距离。这个长度越大,那么人物每一帧移动的距离就会越大。我们可以通过速度向量的长度来确保,速度的大小不会高于某个指定的值。
我们可以通过施加力来实现seek行为,也可以不施加力,仅仅施加一个改变速度,也能够模拟出来。比如如下的代码阐述了在不施加力的情况下如何进行seek行为:
velocity = normalize(target - position) * max_velocity ;
我们需要注意的是,如果不使用施加力的方式,那么一旦seek的目标发生了变化,人物的速度也运动方向将会在瞬间发生改变,所以就会变得不是那么的圆滑。
计算力
如果只有速度方向上的力参与改变的话,那么人物角色将会沿着一条直线进行运动。所以,我们可以通过增加一个力来改变人物的移动,不同的力将会导致物体移动向不同的方向上去。
对于seek行为来说,每一帧增加一点控制力将会很平滑的改变人物移动的速度和方向,避免出现瞬间改变方向的问题。当目标发生移动的时候,施加力的方案也能够很好的平滑的改变速度,使得人物到达目标点。
seek行为需要如下的两种向量:期望速度和控制力:

上图中的desired velocity就是最终人物要到达的速度方向。而steering就是需要增加到人物上面的行为控制力,通过这个控制力,就会将人物推向了目标地点。
这些力可以通过如下的算法求得:
desired_velocity = normalize(target - position) * max_velocity ;
steering = desired_velocity - velocity ;
增加力
当控制力计算出来之后,我们就需要将这个力添加到人物中去。每一帧我们都需要计算新的steering控制力,这样才能够保证每一帧物体都是朝着目标的方向前进的。下图中可以看出,我们的seek路径并不是一条直线,而是很平滑的一条曲线:

下面的代码表示了如何增加力:
steering = truncate(steering, max_force);
steering = steering / mass ;
velocity = truncate( velocity + steering, max_speed);
position = position + velocity ;
上面的计算方式保证了,我们添加的力在可允许的范围之内。我们还将这个力除以了人物的质量,这样就会产生不同质量的物体,他们改变的频率并不一致,所以这样就会看上去更加的丰富了。
结论
行为控制能够产生很多不同的,比较真实的移动效果。我们很容易的就能够通过当前的信息计算出新的控制行为出来。即使计算的方法非常的简单,但是,我们依然能够创建出很多比较有趣和复杂的运动方法出来。
ai seek的更多相关文章
- 网易云课堂_C++程序设计入门(下)_第10单元:月映千江未减明 – 模板_第10单元 - 单元作业:OJ编程 - 创建数组类模板
第10单元 - 单元作业:OJ编程 - 创建数组类模板 查看帮助 返回 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提 ...
- Add AI feature to Xamarin.Forms app
Now, AI is one of important technologies.Almost all platforms have API sets of AI. Following list is ...
- 全图化引擎(AI·OS)中的编译技术
全图化引擎又称算子执行引擎,它的介绍可以参考从HA3到AI OS -- 全图化引擎破茧之路.本文从算子化的视角介绍了编译技术在全图化引擎中的运用.主要内容有: 1. 通过脚本语言扩展通用算子上的用户订 ...
- 小白眼中的AI之~Numpy基础
周末码一文,明天见矩阵- 其实Numpy之类的单讲特别没意思,但不稍微说下后面说实际应用又不行,所以大家就练练手吧 代码裤子: https://github.com/lotapp/BaseCode ...
- 游戏AI技术 2
[Unity3D人工智能编程精粹 2] 1.跟随领队行为. 用靠近(Seek)或追逐(Pursuit)实现跟随领队行为并不好.在Seek中,AI角色会被推向领队,最终与领队占据相同位置.而Pursui ...
- 基于C# 百度AI和科大汛飞语音合成SDK
一.百度语音合成 百度语音合成C# SDK主要是基于Rest API,需要互联网调用HTTP接口,Rest API 仅支持最多512个汉字,合成的格式文件为MP3,没有其它的格式.如果想离线使用需下载 ...
- [C1] Andrew Ng - AI For Everyone
About this Course AI is not only for engineers. If you want your organization to become better at us ...
- 马里奥AI实现方式探索 ——神经网络+增强学习
[TOC] 马里奥AI实现方式探索 --神经网络+增强学习 儿时我们都曾有过一个经典游戏的体验,就是马里奥(顶蘑菇^v^),这次里约奥运会闭幕式,日本作为2020年东京奥运会的东道主,安倍最后也已经典 ...
- 普通程序员如何转向AI方向
眼下,人工智能已经成为越来越火的一个方向.普通程序员,如何转向人工智能方向,是知乎上的一个问题.本文是我对此问题的一个回答的归档版.相比原回答有所内容增加. 一. 目的 本文的目的是给出一个简单的,平 ...
随机推荐
- 【转】C语言快速幂取模算法小结
(转自:http://www.jb51.net/article/54947.htm) 本文实例汇总了C语言实现的快速幂取模算法,是比较常见的算法.分享给大家供大家参考之用.具体如下: 首先,所谓的快速 ...
- 优化MyBatis配置文件中的配置
一.为实体类定义别名,简化sql映射xml文件中的引用 之前,我们在sql映射xml文件中的引用实体类时,需要写上实体类的全类名(包名+类名),如下: <!-- 创建用户(Create) --& ...
- FragmentPagerAdapter实现刷新
在fragmentpageadapter的instantiateItem方法里,他会先去FragmentManager里面去查找有没有相关的fragment如果有就直接使用如果没有才会触发fragme ...
- 数据结构和算法 – 4.字符串、 String 类和 StringBuilder 类
4.1.String类的应用 class String类应用 { static void Main(string[] args) { string astring = "Now is The ...
- select count(*)和select count(1)哪个性能高
select count(*).count(数字).count(字段名)在相同的条件下是没有性能差别的,一般我们在统计行数的时候都会把NULL值统计在内的,所以这样的话,最好就是使用COUNT(*) ...
- java读写Properties文件
Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ...
- 最长公共子序列(LCS)和最长递增子序列(LIS)的求解
一.最长公共子序列 经典的动态规划问题,大概的陈述如下: 给定两个序列a1,a2,a3,a4,a5,a6......和b1,b2,b3,b4,b5,b6.......,要求这样的序列使得c同时是这两个 ...
- hdu 2232 矩阵 ***
一天四个不同的机器人a.b.c和d在一张跳舞毯上跳舞,这是一张特殊的跳舞毯,他由4个正方形毯子组成一个大的正方形毯子,一开始四个机器人分别站在4 块毯子上,舞蹈的每一步机器人可以往临近(两个毯子拥有同 ...
- UI中 frame 与 transform的用法与总结
在iOS中,我们是不可以直接访问控件中frame的结构体的成员的,因此我们需要分三步来改变一个UI控件的位置,大小 一.frame用法 frame的结构体类型为: struct CGRect { CG ...
- canvas加载进度条
<!DOCTYPE html> <html><head><meta http-equiv="Content-Type" content=& ...