【编程书籍】《The Nature of Code》笔记 -《代码本色》6.自治智能体

背景

Reynolds在1999年发表了论文Steering Behaviors for Autonomous Characters,他在里面用“小车”(vehicle)描述自治智能体,我们也打算使用这个术语。

6.3 转向力

*思路:转向力 = 所需速度 - 当前速度
转向力在本质上是当前速度的误差体现:“我应该朝着这个方向运动,实际上却朝着另一个方向运动。误差就是两个方向之间的差异。”
在这里插入图片描述

PVector desired = PVector.sub(target, location);

*改进:
在这里插入图片描述

*原理:
在这里插入图片描述

*特殊:
小车的起始状态是静止的(当前速度为0),转向力就等于所需速度。
*不足:
我们没有考虑小车的转向能力,可以通过限制转向力的大小控制转向能力。
*改进:
直接用float maxforce; 进行限制
在这里插入图片描述

6.4 到达行为

*思路:
假设目标附近有一个给定半径的圆圈,如果小车运动到圆圈之内,它就减速——如果小车位于圆圈的边缘,它的所需速度就等于最大速率;如果已经位于目标位置,所需速度就等于0。

在这里插入图片描述

6.5 所需速度

在游走(wandering)行为中,Reynolds是这么定义所需速度的:
“游走是一种随机性转向,它有一种远期秩序,下一帧的转向角度和当前帧的转向角度相关。
这种移动方式比单纯为每一帧产生随机方向更有趣。”

*思路:
小车把自己前方某处当作未来位置,在这个未来位置上画一个半径为r的圆圈,并在圆上随机选择一个点,在每一帧动画中,这个点都是随机确定的。我们可以把这个点当做目标位置,并由此计算所需速度。
在这里插入图片描述

*思路2:
在这里插入图片描述

*实现:
当前速度 + 垂直于墙向外的速度 = 所需速度
所需速度 - 当前速度 = 墙的斥力

if (location.x > 25) 
{
   
    PVector desired = new PVector(maxspeed, velocity.y); 
    PVector steer = PVector.sub(desired, velocity);
    steer.limit(maxforce);
    applyForce(steer);
}

*俯视图:
在这里插入图片描述

6.6 流场

每个单元格都有一个向量指向特定方向,这样的模型就是流场。
在小车的移动过程中,它会说:“位于我下方的箭头就是我的所需速度!”
在这里插入图片描述

*实现:
1.随机

for (int i = 0; i < cols; i++) //使用嵌套循环遍历流场的所有行和所有列
{
       
    for (int j=0; j < rows; j++) 
    {
   
        field[i][j] = PVector.2D(); //一个随机向量
    }
}

在这里插入图片描述

2.Perlin噪声(弧度映射成角度)

float xoff = 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值