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方向
眼下,人工智能已经成为越来越火的一个方向.普通程序员,如何转向人工智能方向,是知乎上的一个问题.本文是我对此问题的一个回答的归档版.相比原回答有所内容增加. 一. 目的 本文的目的是给出一个简单的,平 ...
随机推荐
- 字符匹配算法之Boyer-Moore算法
Boyer-Moore算法的精华是从后向前,取好后缀与坏后缀中的最大移动位移动搜索词,以达到最快速检索的效果. 详情参考:http://www.ruanyifeng.com/blog/2013/05/ ...
- c语言运算符
一.op=形式的赋值操作符 int a=0; a+=1; //等价于 a=a+1;// a*=1; 二.op=类表达式 int a=10,b=5; a/=b;//等价于a=a/b; a*=b+1; ...
- iOS - 直播相关文章
直播相关文章 直播RTMP可用于测试的服务器地址 FFmpeg avdumpformat输出的tbn.tbc.tbr.PAR.DAR的含义 FFmpeg 3.0 计算视频时长 HLS Streamin ...
- Faster-rnnlm代码分析2 - HSTree的构造
也就是构造一棵Huffman Tree,输入是按照词汇频次由高到低排序的 采用层次SoftMax的做法,是为了使得训练和预测时候的softmax输出加速,原有multinomal softmax,是和 ...
- 使用Autofac在ASP.NET Web API上实现依赖注入
在ASP.NET Web API里使用Autofac 1.通过NuGet安装Autofac.WebApi(当时安装的是Autofac 3.1.0) PM > Install-Package Au ...
- Shell编程基础教程1--Shell简介
1.Shell简介 1.1.查看你系统shell信息 cat /etc/shell 命令可以获取Linux系统里面有多少种shell程序 echo $SHELL 命令可以查看当前你所使用的shell是 ...
- Spell checker
Spell checker Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Subm ...
- 运用ASMIOSTAT脚本监控asm disk磁盘性能
1,脚本作用: 类似于OS的iostat检查磁盘的I/O性能,ASMIOSTAT 脚本用来检查ASM磁盘的性能, 2,下载AMSIOSTAT脚本http://files.cnblogs.com/fil ...
- [荐] jQuery取得select选择的文本与值
csdn:http://blog.csdn.net/tiemufeng1122/article/details/44154571 jquery获取select选择的文本与值获取select :获取se ...
- T-SQL 高级查询
基本常用查询 --select select * from student; --all 查询所有 select all sex from student; --distinct 过滤重复 selec ...