游戏AI之感知(1)

感知

视觉感知

视觉感知是一种常见的感知。

在许多即时战略游戏或者类DOTA游戏里,一个单位的视觉感知往往是圆形范围的。

当然在其他大部分俯视角游戏里,一个智能体的视觉感知应该是类似现实人眼观看的扇形范围

对于横板游戏,可以把视野“竖”起来,检测方式无多少差别。

对于空间更加复杂的3D游戏,可能需要视锥体形状(6个平面)检测而不是扇形或者圆锥形。

潜在的优化是照样做成扇形检测,只是再额外增加高度差检测(即看作2.5D处理)。

但是视野实际还需考虑阻挡问题。

这里提供两种解决视野遮挡的思路:

  1. 在前方扇形范围发出若干条射线进行检测,若检测到某个射线第一个碰到的物体是目标物体,则感知到该目标。

  1. 在所在区域的所有潜在目标进行遍历,每次遍历 先判断是否在扇形范围内,

    再做一条智能体到目标的射线,若射线碰到的第一个物体是该目标,

    则感知到该目标。

第一个思路比较容易实现,第二个则算法效率比较高。

第二个思路要是预先“规划”好区域,尽可能过滤不必要的目标,缩小所在区域的潜在目标数量

(例如屋外看不到房内的人,也就可以过滤掉房内的人),那么检测速度就非常快。

听力感知

听力感知一般比较简单粗暴:一个圆形/球形范围检测,

而且一般还无需考虑阻挡问题(现实中的声音传播可近似看作无阻挡)。

另外的,听力感知一般需要得到的信息:

  • 声音来源(例如发出声音的生物)
  • 声音大小和距离

通过简单的线性计算,由声音大小和距离可以计算出实际接受声音的大小。

将这个信息作为额外数据交由决策使用。

(例如一个警卫,听到太大的声音就进入敌对状态,小的声音则进入警戒状态)

其它感知

这个其实应该叫杂项感知或者根据需求随便取名的感知。

一般来说,视觉感知和听力感知已经足够一个基本的智能体所需感知了。

但极少情况还可能一些智能体需要知道各种杂项信息

(例如队长给警卫发送了一条无线电消息,要求警卫赶往队长所在位置支援)

实现

感知可以做成一种类,提供 检测函数 和 结果访问接口。

下面提供一种大致的示例(C++):

//视野感知
class ViewPerception {
public:
    //进行一次视野感知探测:
    void check(Vector3 position) {
        //先清理结果
        perceptionResult.clear();
        //逐个潜在目标检测
        for (Biology* target : targets) {
            //运用简单的数学运算判断点是否在扇形范围:
            //先进行距离判断是否在半径内。
            //look向量和射线单位向量的向量积 若小于 向量积限制,
            //则证明该射线离look向量的角度 超出向量积限制的对应角度。
            Vector3 offset = target.getPosition() - position;
            float distanceSq = offset.lengthSquare();
            if (distanceSq < radiusSq)continue;
            float crossproduct = offset.normalize().dot(look);
            if (crossproduct < dotproductlimit)continue;
            perceptionResult.emplace_back(target);
        }
    }
    //访问感知目标结果
    const std::list<Biology*>& getResult()const {
        return perceptionResult;
    }
private:
    float radiusSq;             //扇形半径的平方
    Vector3 look;               //朝前的单位向量
    float dotproductlimit;  //向量积限制
    std::list<Biology*> perceptionResult;   //使用链表存储感知到的目标
};
//听力感知
class ListenPerception {
public:
    //进行一次听力感知探测:

    void check(Vector3 position) {
        perceptionResult.clear();
        //逐个潜在声源检测
        for (Voice& voice : voices) {
            //判断目标点是否在圆形范围,即距离是否在半径内。
            Vector3 offset = voice.getPosition() - position;
            float distanceSq = offset.lengthSquare();
            if (distanceSq < radiusSq)continue;
            perceptionResult.emplace_back(voice.getBiology(),voice.getVolume()/distanceSq);
        }
    }
    //访问感知目标结果
    const std::list<std::pair<Biology*, float>>& getResult()const {
        return perceptionResult;
    }
private:
    float radiusSq;         //范围半径
    std::list<std::pair<Biology*,float>> perceptionResult;  //使用链表存储感知到的目标+实际声音大小
};

TIP:

判断点在圆形范围应->比较距离的平方和半径的平方,每次判断就可以减少一次开方的运算。

下一篇博文将介绍黑板。

原文地址:https://www.cnblogs.com/KillerAery/p/10053817.html

时间: 2024-10-10 22:32:26

游戏AI之感知(1)的相关文章

实现简易而强大的游戏AI——FSM,有限状态机

http://blog.friskit.me/2012/05/introduction-of-fsm/ 在很久很久以前,受限于计算机性能和图形效果,游戏往往是以玩家为唯一主动对象的,玩家发出动作,游戏响应结果.除此之外,不需要系统在玩家没有发出动作时产生响应.可以说,玩家的动作与游戏是“同步”的. 随着计算机的处理能力的发展,更绚丽的游戏逐渐产生.玩家就不能只满足盯着屏幕上静态的一张张图片进行游戏.也就是说,游戏应该有自己的方式能够与玩家主动沟通.这样才能使游戏更加生动,虚拟的环境显得更加真实.

棋牌源码搭建教程之棋牌游戏AI算法

棋牌游戏客户端实现采用Flash 9开发,服务端采用Win32+VC6开发(基于IOCP),数据库网关采用Win32+VC6开发(基于IOCP,MySQL5实现了处理线程池和数据库连接池).虽然服务器端去年就已经完成,但相应的机器人AI算法一直没有能力去实现.今天把它拿到Blog上来希望有机会和感兴趣的兄弟们探讨下. Kevin在他的Blog上给出了他的实现,其给出的算法思想是用宽度优先生成一棵搜索树,再根据玩牌的技巧进行剪枝与判权,机器人的AI能够像养成类游戏那样,实现在蹂躏下慢慢成长,水平逐

使用行为树(Behavior Tree)实现游戏AI

原地址:http://blog.csdn.net/akara/article/details/6084786 [原创]使用行为树(Behavior Tree)实现游戏AIby AKara 2010-12-09 @ http://blog.csdn.net/akara @ akarachen(at)gmail.com @weibo.com/akaras 谈到游戏AI,很明显智能体拥有的知识条目越多,便显得更智能,但维护庞大数量的知识条目是个噩梦:使用有限状态机(FSM),分层有限状态机(HFSM)

对弈类游戏的人工智能(5)--2048游戏AI的解读

前言: 闲得没事, 网上搜"游戏AI", 看到一篇<<2048游戏的最佳算法是?来看看AI版作者的回答>>的文章. 而这篇文章刚好和之前讲的对弈类游戏AI对应上. 于是有了想法, 想把它作为一个实例来进行解读, 从而对之前偏理论的文章做个总结. 承接上四篇博文: (1). 评估函数+博弈树算法 (2). 学习算法 (3). 博弈树优化 (4). 游戏AI的落地 可能有些人会疑惑? 2048并非对弈类类型? 传统的博弈树模型是否能应用于此? 客官莫急, 让我们来一

如何建立一个完整的游戏AI

http://blog.friskit.me/2012/04/how-to-build-a-perfect-game-ai/ 人工智能(Artificial Intelligence)在游戏中使用已经很多年了,并且到现在越来越完善.如果你不在你的游戏中加入完善的游戏智能,那么别人就认为你的游戏缺少可玩性.在游戏中,AI并不一定要包括神经网络,学习系统和复杂的数学结构,游戏AI只是游戏中一个重要部分,它是活动的,并不是科学性质的.我认为如何建立一个游戏AI,最主要的就是要明白你想在游戏中实现什么效

游戏AI之模糊逻辑(4)

if(condition) then dosomething... 这次主要围绕的是游戏AI该如何模仿人类地判断条件(condition). 人类的逻辑 人类的逻辑思考是复杂的,模糊的. 一些人类逻辑思考的例子:"把面包切成中等厚度","这波我很强","你好骚啊","小A有点高".... 而对于计算机,它只认识离散的数值: 假设在一个问题中,智商划分了3个集合:笨拙 = {70~89},平均 = {90~109},聪明 = {

用Cocos2d-x3.x和C++11编写2048游戏以及游戏AI

话说,年仅19岁的意大利人Gabriele Cirulli于2014年3月完成并发布在github上,游戏设计来自于<1024>,而<1024>灵感来源于<Threes!>的移动端游戏.然而游戏飙升的人气超乎他的想象,人们忘记了Flappy Bird, 2048成了 网络上"最上瘾的东西". 我是完全为了熟悉Cocos2d-x3.x版本,才写这个游戏的.这个游戏的玩法如下: 该游戏使用方向键让方块上下左右移动.如果两个带有相同数字的方块在移动中碰撞,

游戏AI之A*寻路(2)

前言:寻路是游戏比较重要的一个组成部分.因为不仅AI还有很多地方(例如RTS游戏里操控人物点到地图某个点,然后人物自动寻路走过去)都需要用到自动寻路的功能. 本文将介绍一个经常被使用且效率理想的寻路方法--A*寻路算法,并且提供额外的优化思路. 图片及信息参考自:https://www.gamedev.net/articles/programming/artificial-intelligence/a-pathfinding-for-beginners-r2003/ A*算法介绍 寻路,即找到一

游戏AI(二)—行为树优化之

上一篇我们讲到了AI架构之一的行为树,本篇文章和下一篇文章我们将对行为树进行优化,在本篇文章中我们讲到的是内存优化 问题 上一篇中我们设计的行为树由于直接采用new进行动态内存分配,没有自己进行管理.因此行为树各节点的存储位置会散布在内存空间的各处,行为树在不同节点中切换时会导致Cache频繁失效. 通过内存管理改变行为树节点的内存分布,可以显著提高行为树的内存性能. 解决办法 我们可以在BehaviorTree中引入一组内存分配的API来保证各节点尽量分配在连续的内存上,代码如下 Behavi