matlab 柏林噪声,游戏AI怎么写(一)——高级随机技术

写在前面

最近在研究游戏AI,感觉要写一个不傻的AI并没有那么容易,于是开始研究AI到底该怎么写,有没有什么技巧和框架。

发现Web图书:Game AI Pro

刚开始读这一套书,我似乎意识到了把技巧理论化的重要性,我写AI时用瞎搞的逻辑,居然是什么“施密特触发器”“双阈值法滞后”,我决定把这一套书读完。

知识点

1.施密特触发器和滞后

据说双阈值法滞后是保持AI控制系统干脆利落的关键

例:物体A跟随物体B,物体A与物体B的距离超过5米,A就会靠近B,当A与B的距离缩小到2.5米以下的时候,停止跟随。再次超过5米,又会进入跟随状态。

const float SEPARATION_DISTANCE = 2.5f;

const float APPROACH_DISTANCE = 5.0f;

if (approach_player == false) {

if (distance > APPROACH_DISTANCE)

{

approach_player = true;

//动作函数

}

}

else

{

if (distance < SEPARATION_DISTANCE)

{

approach_player = false;

}

}

注:这段是c语言伪代码,本篇博客中其余脚本均为MATLAB

2.高斯随机值

你一定了解过正态分布,在概率论,统计学等诸多学科都有用到

如果不知道: https://zh.wikipedia.org/wiki/正态分布

我们经常用到伪随机数rand(),它可以产生白噪声,是绝对随机的。但这样的随机往往满足不了我们的需求

比如我们以 vec2(0.5,0.5)为中心,产生100个随机坐标

clear;

x=rand(1,100);

y=rand(1,100);

scatter(x,y);

542fba917ff2eca3e74a51bac2b4f0b3.png

但是过于随机了,我们想增加落在 vec2(0.5,0.5)周围的概率

clear;

x=zeros(1,100);

y=zeros(1,100);

for i=1:20

x=x+rand(1,100)*0.05;

y=y+rand(1,100)*0.05;

end

scatter(x,y);

db7a6bb3028faba50fd84541cf63689d.png

射击游戏的精准度应该就是根据正态分布标准差得来的

3.随机处理对策

我们随机生成40个 0 1

clear;

x=1:1:40;

y=floor(rand(1,40)*2.0);

stairs(x,y);

axis([0 40 -0.5 1.5]);//设置XY轴范围

set(gca,'xtick',x);//设置坐标精度

1599be3ee5b77b330788d919a5c34010.png

似乎并没有我们想象的那么随机,现实是会出现很多连续序列。//所以说现实和我们计划的总是不一样

解决办法:根据情况翻转数值,比如连续和重复情况

总之就是设定规则,比如浮点型的差值,规律性,根据情况重新生成,再次判断

筛选高斯随机数的随机范围,可以根据值,标准差,重新生成

注意保持随机算法各自独立

4.应用于游戏AI中的柏林噪声

这是当然了

一维柏林噪声在游戏AI中的潜在应用有

角色移动:方向,速度,加速度

动画叠加层:角色的面部表情或注释动作增加噪声影响

精准度:连续的成功或失败,需要保持的势头

注意力:守卫的警惕性、反应时间

行为风格:防御型,进攻型

角色情绪:冷静、愤怒、高兴、沮丧、狂暴、无所事事、专心致志

/论读书的好处,我甚至想到了,二维柏林FBM+阈值可以用来给大面积植被上MainColor

在有大量角色而且玩家不会仔细观察这个角色时,这种方法尤为有用

limx=[0 10];

dx=1/64;

x=limx(1):dx:limx(2);

numx=diff(limx)+1;

uxmat=rand(1,numx+1)*2-1;

numx_z=diff(limx)/dx+1;

zmat=zeros(1,numx_z);

for j=1:length(x)

ddx=x(j)-floor(x(j));

ux=uxmat(1,floor(x(j))-limx(1)+1);

n0=(ux*ddx);

ddx=x(j)-floor(x(j))-1;

ux=uxmat(1,floor(x(j))-limx(1)+2);

n1=(ux*ddx);

zmat(j)=lerp(n0,n1,x(j)-floor(x(j)));

end

zmat=zmat*2;

plot(x,zmat)

function u=lerp(a,b,t)

tw=6*t.^5-15*t.^4+10*t.^3;

u=(1-tw)*a + tw*b;

end

48e91ae5cd87ed66e3538396d13f8f47.png

可控因素:频程的阶数、频程的范围、每阶的放大倍数、差值函数的选择。

未完待续

此分类的下一篇将会记录AI常用的体系框架及技巧。

只要实习之余我有时间就会尽量填坑。。。

挖坑太多填不上,也请见谅

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值