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方向
眼下,人工智能已经成为越来越火的一个方向.普通程序员,如何转向人工智能方向,是知乎上的一个问题.本文是我对此问题的一个回答的归档版.相比原回答有所内容增加. 一. 目的 本文的目的是给出一个简单的,平 ...
随机推荐
- auto(c++11)
C++primer 第五版,第三章出现了此段程序,求解读附源码:代码1:#include<iostream>#include<string>using namespace st ...
- Python lambda函数使用
- Jmeter 提取http请求返回值里json数据参数化方法
第三方插件下载地址:http://jmeter-plugins.org/downloads/all/ 插件下载后解压:找到JMeterPlugins-Extras.jar,把JMeterPlugins ...
- JVM内存区域与内存溢出异常
Java虚拟机在执行java程序时会把它所管理的内存会分为若干个不同的数据区域,不同的区域在内存不足时会抛出不同的异常. >>运行时数据区域的划分 (1)程序计数器程序计数器(Progra ...
- SQL——触发器——插入触发器——边学边项目写的。
需求: 项目表项目编码触发器编写 为项目表DwProject编写触发器,目的为当创建新项目时,且ProjectNo 为Null或空字符串时,自动创建项目编号,编号格式为4位年号,2位月份,2位顺序号, ...
- Bootstrap 排版 笔记
Bootstrap 使用 Helvetica Neue. Helvetica. Arial 和 sans-serif 作为其默认的字体栈. 使用 Bootstrap 的排版特性,您可以创建标题.段落. ...
- VS2015 Xamarin for iOS
VS2015环境配置 VS2015安装不多说.其实Xamarin 和微软感觉并不是什么好基友,Xamarin以前一直像个可怜的娃,以插件的形式寄生于VS中.现在只不过形势稍微好点了,VS2015 在明 ...
- wp8 入门到精通 Utilities类 本地存储+异步
public class CCSetting { public async static void AddOrUpdateValue<T>(string key, T value) { t ...
- hdu 4043 2011北京赛区网络赛D 概率+大数 **
推出公式为:P = A(2n,n)/(2^(2n)*n!) 但是不会大数,学完java再补
- 提升 LaTeX 效率的小工具:Detexify LaTeX handwritten symbol recognition
Detexify LaTeX handwritten symbol recognition 用 LaTeX 的人找符号的表示方法通常很费事,需要去翻长长的列表.Detexify 是一个省事的小网站,只 ...