Steering_Behaviors

Steering Behaviors

[TOC]

Steering Behaviors 概述

Steering Behaviors其实是一种转向力,运动速度,排斥力和各种力相互影响的结果,一般可以用这个来做挤压感觉

转向力

这里的转向力可以通过:

1
velocity = Vector.Lerp(sVelocity, tVelocity, time)

公式插值获得,让其选择一个比较柔和的方式得到。

运动速度

运动速度一般都是运动物体自带,可以直接根据物体获得

排斥力

排斥力是通过计算周边的单位对其产生,计算方式:

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
Vector2 GetSeparation(int id, Vector2 pos)
{
float SEPARATION_RADIUS;
float SEPARATION_RATE;
int count;
Vector2 seq = Vector2.zero;
foreach (int objId in objectIds)
{
if (objId == id)
{
continue;
}
float dis = GetDistance(objId, id);
if (dis <= SEPARATION_RADIUS)
{
tPos = GetPos(objId);
seq += (pos - tPos);
count++;
}
}
if (count > 0)
{
seq /= count;
seq = seq.normalized * SEPARATION_RATE;
}
return seq;
}

可以通过调整SEPARATION_RADIUS和SEPARATION_RATE达到自己想要的结果

其他力可以相应的加上

最终公式

最后得到公式:

1
2
3
Vector velocity = Vector.Lerp(sVelocity, tVelocity, time);
Vector seq = GetSeparation();
Vector target = (velocity + seq) * speed;

Steering Behaviors其实是一个很好的一个解决方案,里面涉及的内容其实挺多的,转向力的选取也有很多的方式,斥力选取也是。

具体的参考:

https://gamedevelopment.tutsplus.com/series/understanding-steering-behaviors–gamedev-12732

https://www.red3d.com/cwr/steer/gdc99/

附件:

FlowField

流场和OCRA,Steer

特别说明

附件里面还涉及要一个OCRA的算法:

源码来源:https://github.com/snape/RVO2-CS

论文:ORCA.pdf

https://zhuanlan.zhihu.com/p/109556568

具体的细节,之后研究了再考虑

打赏

请我喝杯咖啡吧~

支付宝
微信