Steering Behaviors: Seek 转向行为 : 寻找

文章将翻译教程,然后我会根据项目代码,在Unity3d 实现相关相应的内容。

Steering Behaviors 意在使游戏中的AI个体具备真实的运动行为,通过对力的施加与整合,使游戏个体具备类生命体般的运动特征。这项技术并不基于寻路或者别的宏观算法,而是基于个体局部周围空间的信息,单个的行为实现起来非常的方便,它们组合在一起又能有非常复杂的行为方式。

整个背后的想法,这些行为由Craig W. Reynolds 提供。这些不是由复杂的寻路决策活着全局计算,而是用本地信息,比如邻向量。总之这样会让事实变得简单和容易理解,不过依然可以产生非常复杂的移动模式。

提示:尽管用AS3写的,不过你应该可以使用同样的技术和概念在所有的游戏开发环境。首先必须明白基础的数学概念。

(我会直接将代码移植到Unity里。版本是2018.1.2.f1 unity里有个assets已经实现了,但是并不是很好用。我重写个)。

图片将用原网页的Src,复制粘贴太麻烦了,如果哪天图挂了,就看文字吧。

转向行为实现所有的力的影响可以用数学的向量表示,vectors.

用向量表示他们是一个相当好的方法,因为这些作用力会影响对象的速率和坐标。

尽管,vector有方向,不过表示坐标的时候会忽略(我们假设坐标向量指向目标的当前位置)

Character positioned at x y with velocity a b

上图表示一个对象在位置在坐标(x,y)并且他的速度为(a,b).它的移动用欧拉积分表示为Euler integration:

速度向量的方向控制对象朝向,它的长度或者magnitude量级,控制他每帧移动多少。长度越长,速度越快。速度向量可以被truncated,截断,保证在一定的范围内,用max velocity最大速度控制。下面举个例子

移动鼠标来移动对象。

红色方格会朝着鼠标光标移动。这种移动模式描述了寻找行为,目前为止还没有用到转向的力应用到对象上。绿色的线表示速度向量。计算公式如下:

速率(速度) = 归一化/标准化(目标坐标 – 对象坐标) * 最大速度

在unity里关于normalize
JavaScript ⇒ Normalize(value:Vector3): Vector3; 
C# ⇒ Vector3 Normalize(Vector3 value);

Description 描述

Makes this vector have a magnitude of 1.

使向量的长度为1。

When normalized, a vector keeps the same direction but its length is 1.0.

当归一化的,一个向量保持相同的方向,但它的长度为1.0。

Note that this function will change the current vector. If you want to keep the current vector unchanged, use normalized variable.

注意,这个函数将改变当前向量,如果你想保持当前的向量不改变,使用normalized变量。

If this vector is too small to be normalized it will be set to zero.

如果这个向量太小而不能被归一化,将返回零向量。

JavaScript:

	Debug.Log (Vector3.Normalize (new Vector3(6,3,2)));
C#:

using UnityEngine;
using System.Collections;
 
public class ExampleClass : MonoBehaviour {
    void Example() {
        Debug.Log (Vector3.Normalize (new Vector3(6,3,2)));
    }
}
JavaScript ⇒ Normalize(): void; 
C# ⇒ void Normalize();

C#:

using UnityEngine;
using System.Collections;
 
public class ExampleClass : MonoBehaviour {
void Update () {
	Vector3 tem = Tagrget.position;
	tem.Normalize();
	Tagrget.position = tem;
    }
}

如果只考虑速度方向的力,就会有这种突兀的行为,Steering Behaviors 的核心理念就是通过施加多个力(Steering Forces)来影响个体的移动,个体的运动方向根据这些力的合力得出。

就Seek行为来说,每帧向游戏个体施加一个额外的转向力来调整速度,会使路径变化很平滑,防止突兀的改变。如果目标位置变了,个体也会根据新位置慢慢的转变自己的速度向量。

Seek行为被分解为两个力:目标速度,和转向速度。

Steering forces

目标速度是一个力指引对象朝着目标点走最短的路,很明显是两点之间的直线。这个是当前唯一的作用到角色的力。

转向力是目标速度减去个体的当前速度得出的,它的物理意义就是向着目标位置给个体一个推力。

这些作用力计算如下:

目标速度 = 归一(目标坐标-对象坐标)*最大速度

转向力 =  目标速度-当前速度

计算了转向力之后,它必须和原先版本的速度方向合成,再施加给个体。这个每帧施加的额外转向力会使得个体以平滑的方式靠近目标点。橙色就是合成后的寻找路径。

Seek path

最终的计算方法为

合成转向力 = 截断(转向力,最大力)

合成转向力 = 转向力 / 质量

速度 = 截断(速度+转向力 ,最大速度)

坐标 = 坐标+速度

转向力会被截断在一个范围,防止其超过个体最大可承受力。被截断的转向力会除以个体的质量,因为不同重量的物体运动快慢是不同的。

转向行为对于创建真实的移动模式相当好用。关键是使用本地信息计算和施加力去产生行为。尽管很简单就可以实现计算,产生的效果可以非常复杂。

This tutorial described the basics of steering behaviors, explaining the seek behavior. Over the next few posts, we will learn about more behaviors. Check out the next post: Flee and Arrival.

下一章介绍逃逸和到达

发表评论

邮箱地址不会被公开。