06/16/2020
人工智能AI
基础介绍
最近在做关于3D坦克大战的AI, 我们打算做一个简单的AI坦克,这个坦克只有巡逻和战斗状态
巡逻状态
坦克移动路线
简单的行动路线,给定一个移动距离,前后移动这个坦克。
坦克可视范围(半径和角度)
通常坦克的扫视范围是根据炮台的朝向画圆,半径和扫过的角度可以自由决定,如果敌方坦克进入这个范围,AI坦克将会发现它。那么如何检测其他坦克进入AI坦克的扫视范围呢?
已知量
- 其他坦克的位置
- 自身坦克的位置
- 自身坦克炮台的朝向和扫视角度(弧度制表示)
struct AiTank
{
Vector3 position;
Vector3 orientation; //Ai炮台的朝向
float scanRadius = 10.0f;
float scanRadian = 3.14/8; //弧度制表示 正负 180度/8
};
判断依据
- 两坦克的位置求距离公式与扫视半径比较
- AI坦克的炮台的正面朝向和AI到目标坦克的夹角与扫视角度比较
- 点乘可以计算两个向量的夹角,并判断是否在扫射角度里还是角度外
- 点乘为正,锐角,0为直角,负数为钝角,值越大表示锐角越小
- 注意:点乘是不分先后顺序的,即 a ⋅ b = b ⋅ a a \cdot b = b \cdot a a⋅b=b⋅a
//伪代码
bool findEnemy(const AiTank& aiTank,const Tank& target){
Vector3 pointToTarget = target.position - aiTank.position;
float distance = Vector3Length(pointToTarget);
if(distance <= scanRadius) // 距离判断,在扫视半径的圆内
{
float cosValue =