Understanding Steering Behaviors:Flee and Arrival(行为控制-逃离和抵达)

原文链接:http://gamedevelopment.tutsplus.com/tutorials/understanding-steering-behaviors-flee-and-arrival--gamedev-1303

跑开

在前面介绍的寻找行为中,我们介绍了一种基于两个向量力来将人物推向目标的行为方式:预期速度和控制力

desired_velocity = normalize(target - position) * max_velocity ;

steering = desired_velocity - velocity ;

在上面说的desired_velocity是从人物直接指向目标的。我们只要简单的将目标点减去人物的点就能够得到这个速度。

而在本节中,同样的,我们也需要使用这样的两个力,但是,我们却是使用这两个力来避免物体移动到目标那里去。

我们现在计算新的desired_velocity,这个速度想在用人物的位置减去目标的位置,这样得到的desired_velocity方向就和上面介绍的行为方式的方向是相反的

我们同样的来用代码来阐释这个概念:

desired_velocity = normalize(position - target) * max_velocity

steering = desired_velocity - velocity

上面计算出来的desired_velocity表示了最容易逃离的路线。而产生的steering控制力将会使的物体丢弃原有的移动路径,而迫使它向desired_velocity靠近。

我们可以将逃离行为和寻找行为联系在一起:

flee_desired_velocity = -seek_desired_velocity

换句话说,一个向量是另外一个向量的反向向量。

增加逃离力

当我们计算出来了逃离的力之后,我们就必须将这个力添加到人物的速度向量上面去。由于这个力是将物体推向目标相反的方向上去,所以,每一帧物体都会向逃离目标的方向去移动,自然而然就产生了一条逃离路径了。

如何增加逃离力,和前面介绍的seek行为是一样的累积方法。

上面的算法是一直的逃离,我们可以添加一个熟悉来控制,如果距离目标有一段距离之后就不再进行逃离。

抵达

寻找行为使的物体向一个指定的目标移动。当到达这个目标之后,物体会在目标附近来回不断的乱动,也就是说会穿过目标地点。而抵达行为就是控制人物不要穿过这个目标点,在当人物慢慢的接近目标点的时候,速度会慢慢的下降,直到最后在目的地点停止下来。

这个行为由两个部分控制。当人物远离目标地点的时候,就像原来的seek行为一样。

当人物距离目标地点很近的时候,在减速区域的时候,我们就慢慢的让人物减速下来:

当人物进入这个圆圈的时候,它就会慢慢的减速下来。

减速

当人物进入了减速区域的时候,它的速度就会线性的慢慢的减下来。这样的效果可以通过简单的增加一个新的控制力到人物的速度向量上来就可以做到。当这个方法最终增加的速度变成0的时候,那么就表示将没有任何的速度添加到这个人物的位置上:

<span style="font-family:Microsoft YaHei;">// If (velocity + steering) equals zero, then there is no movement
velocity = truncate(velocity + steering, max_speed)
position = position + velocity

function truncate(vector:Vector3D, max:Number) :void {
    var i :Number;
    i = max / vector.length;
    i = i < 1.0 ? i : 1.0;
    vector.scaleBy(i);
}</span>

为了保证人物会慢慢的减速下来,我们不能立即的将人物的速度变成0.我们可以通过人物现在距离目标的地点和减速区域的半径来判断应该对人物现有的速度做多少的变化,从而能够很平滑的实现减速效果:

<span style="font-family:Microsoft YaHei;">// Calculate the desired velocity
desired_velocity = position - target
distance = length(desired_velocity)

// Check the distance to detect whether the character
// is inside the slowing area
if (distance < slowingRadius) {
    // Inside the slowing area
    desired_velocity = normalize(desired_velocity) * max_velocity * (distance / slowingRadius)
} else {
    // Outside the slowing area.
    desired_velocity = normalize(desired_velocity) * max_velocity
}

// Set the steering based on this
steering = desired_velocity - velocity</span>

如果人物距离目标地点的距离远远的大于slowRadious,那么就意味着这个人物距离目标地点非常的远,所以,我们只要简单的使用寻找行为来寻找目标点即可,并且保持速度不变。

如果他们之间的距离比slowRadious要小的时候,这就意味着,人物抵达了减速区域,所以现在我们需要将它进行减速。

distanc/slowRadious 的值在减速区域中将会从0到1不等。这样的线性变化就会使得人物的移动速度慢慢的呈线性减速下来。

正如前面介绍的那样,这个移动方式将会像下面这样进行表示:

<span style="font-family:Microsoft YaHei;">steering = desired_velocity - velocity
velocity = truncate (velocity + steering , max_speed)
position = position + velocity</span>

如果预期速度最后降低到0的时候,那么控制力的大小就会变成-velocity。所以,把这个行为力加到速度上的时候,就会导致人物最终移动的速度变成了0,停止下来了。

结论

逃离行为使的人物远离目标地点,而抵达行为使得人物在抵达地点时停止下来。这样行为都是可以在一定程度上进行组合从而做成类似于跟随,逃离这样的行为。

Understanding Steering Behaviors:Flee and Arrival(行为控制-逃离和抵达)

时间: 2024-10-07 18:07:34

Understanding Steering Behaviors:Flee and Arrival(行为控制-逃离和抵达)的相关文章

Understanding Steering Behaviors: Seek (行为控制-寻找)

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

Understanding Steering Behavior: Collision Avoidace(行为控制之:碰撞躲避)

原文链接:http://gamedevelopment.tutsplus.com/tutorials/understanding-steering-behaviors-collision-avoidance--gamedev-7777 介绍 进行碰撞躲避的方法实际上非常的简单,就是在我们检测到"将要"和一个碰撞物相撞的时候,我们产生一个躲避的力来避免进行碰撞.记住,我们仅仅使用一个最近的障碍物来计算躲避的力,就算有很多的障碍物,这样的算法同样能够很好的运行. 所以可以看出,这个算法就需

steering behaviors 转向行为 集群模拟 小结

继今年(虽然离2015年只有一天了但还是2014)暑假简单接触了一些flocking 集群的概念后一直没有完完整整的把这个算法里面的一些行为规则做一些归类和实现.最近一直还在深入的学习Houdini里面的VEX语言,这里简单讲一讲我的一些学习过程,并附上在Houdini里面实现的方法和源码. 集群模拟中每个个体的行为规则(前 1 - 8 是已经实现了的,后面的在游戏领域拥有应用,这里只提一下). seek 寻找 flee 逃跑 wander 随意行走 separation 分离 cohesion

Steering Behaviors

[Steering Behaviors] 1.Seek 下述的算法是一个基本Seek行为,但不带任何Steering输出的力.在该公式作用下,游戏个体的移动方式是直线型的,如果target的位置变了的话,个体会立即响应,并且会以新的方向,以直线的形式向目标位置靠近,这会给人一种从当前路径突兀的变换到新路径的感觉. Seek行为被分解为两个力:目标速度,和转向速度.目标速度始终朝向目标位置,转向力是目标速度减去个体的当前速度得出的,它的物理意义就是向着目标位置给个体一个推力. 计算了转向力之后,它

CVPR 2015 papers

CVPR2015 Papers震撼来袭! CVPR 2015的文章可以下载了,如果链接无法下载,可以在Google上通过搜索paper名字下载(友情提示:可以使用filetype:pdf命令). Going Deeper With ConvolutionsChristian Szegedy, Wei Liu, Yangqing Jia, Pierre Sermanet, Scott Reed, Dragomir Anguelov, Dumitru Erhan, Vincent Vanhoucke

先搜集下关于行动列表和行为树的AI制作

作为人类,我们似乎总倾向于使用自己所熟悉的解决方法.我们总是会按照我们所知道的方式去做某些事,而不是按照做这些事的“最佳”方式.因为总是带着这种想法,所以我们很容易使用一些过时的技术,并使用那些同时代人所不理解,或者并不是那么有效的方式去执行特定功能.所以我希望通过本文以及之后的文章向广大读者们介绍更多能够在编程中带给你们帮助的解决方法.今天我要分享的便是行动列表! 行动列表是所有游戏开发者都必须清楚的简单但却强大的AI.尽管不能与巨大的AI网络相匹敌,但是它们允许相对复杂的突发行为,并且执行起

Android View视图系统分析和Scroller和OverScroller分析

Android  View视图系统分析和Scroller和OverScroller分析 View  视图分析 首先,我们知道.在Android中全部的视图资源(无论是Layout还是View),终于的父类都是View类.各式各样的Layout仅仅是对ViewGroup的一中特别的实现.各种View也仅仅是View的特别实现. 而ViewGroup也是对于View的一种实现.所以说全部的View元素在根本上都是一样的.当然这并不等于说View == ViewGroup,就好比仅仅有ViewGrou

Android中滑屏实现----触摸滑屏以及Scroller类详解 .

转:http://blog.csdn.net/qinjuning/article/details/7419207 知识点一:  关于scrollTo()和scrollBy()以及偏移坐标的设置/取值问题 scrollTo()和scrollBy()这两个方法的主要作用是将View/ViewGroup移至指定的坐标中,并且将偏移量保存起来.另外: mScrollX 代表X轴方向的偏移坐标 mScrollY 代表Y轴方向的偏移坐标 关于偏移量的设置我们可以参看下源码: package com.qin.

Java并发/多线程系列——线程安全篇(1)

创建和启动Java线程 Java线程是个对象,和其他任何的Java对象一样.线程是类的实例java.lang.Thread,或该类的子类的实例.除了对象之外,java线程还可以执行代码. 创建和启动线程 在Java中创建一个线程是这样完成的: Thread thread = new Thread(); 要启动Java线程,您将调用其start()方法,如下所示: thread.start(); 此示例不指定要执行的线程的任何代码.启动后,线程将立即停止. 有两种方法来指定线程应该执行什么代码.第