首页 > 编程语言 >AI 编程实践

AI 编程实践

时间:2022-11-15 17:46:25浏览次数:42  
标签:编程 dist AI Vector2D DesiredVelocity 实践 pVehicle TargetPos speed

自治的可移动游戏智能体

SteeringBehaviors(操纵行为)

这些方法都返回执行该行为需要的力(实际是返回单位质量物体1s内修正速度需要的加速度,根据F=m(v1-v0)/t, 这个返回值也是单位质量的物体具有该加速度需要的力)。

Seek (靠近)

//返回一个能让物体朝向目标移动的力
Vector2D SteeringBehavior::Seek(Vector2D TargetPos)
{
  //由目标距离和当前距离算出“期望速度”,大小是最大速度
  Vector2D DesiredVelocity = Vec2DNormalize(TargetPos - m_pVehicle->Pos())
                            * m_pVehicle->MaxSpeed();
  //期望速度 - 当前速度 = 加速度
  return (DesiredVelocity - m_pVehicle->Velocity());
}

Flee (逃逸)

Vector2D SteeringBehavior::Flee(Vector2D TargetPos)
{
  /* PanicDistanceSq 可以设定逃逸距离,在这个距离内,才发生逃逸。
  if (Vec2DDistanceSq(m_pVehicle->Pos(), target) > PanicDistanceSq)
  {
    return Vector2D(0,0);
  }
  */

  //Flee和和Seek一样,只是方向正好相反
  Vector2D DesiredVelocity = Vec2DNormalize(m_pVehicle->Pos() - TargetPos) 
                            * m_pVehicle->MaxSpeed();

  return (DesiredVelocity - m_pVehicle->Velocity());
}

Arrive (抵达)

Seek行为无法停在目标处,而是不断在目标位置穿来穿去。Arrive可以让物体慢慢停在目标位置

/**
*@param:deceleration  enum Deceleration{slow = 3, normal = 2, fast = 1};
*/
Vector2D SteeringBehavior::Arrive(Vector2D     TargetPos,
                                  Deceleration deceleration)
{
  Vector2D ToTarget = TargetPos - m_pVehicle->Pos();

  //当前位置到目标位置距离
  double dist = ToTarget.Length();

  if (dist > 0)
  {
    //根据这个Scalar和Deceleration计算到达目标位置的期望速度(不需要精确)。
    const double DecelerationTweaker = 0.3;
    //speed是希望物体到达目标时的速度大小
    double speed =  dist / ((double)deceleration * DecelerationTweaker);     

    //确保速度不超过最大速度
    speed = min(speed, m_pVehicle->MaxSpeed());
    
    // ToTarget / dist * speed更好理解, 向量/大小就是normal的过程
    Vector2D DesiredVelocity =  ToTarget * speed / dist;

    return (DesiredVelocity - m_pVehicle->Velocity());
  }

  return Vector2D(0,0);
}

标签:编程,dist,AI,Vector2D,DesiredVelocity,实践,pVehicle,TargetPos,speed
From: https://www.cnblogs.com/pixs-union/p/16893234.html

相关文章

  • 网络编程
    软件开发架构1.c/s架构 client:客户端server:服务端"""就是我们使用计算机下载下来的一个个app本质互联网公司的客户端软件通过这些客户端软件我们就......
  • 网络编程
    目录一.软件开发架构1.C/S架构2.B/S架构二.架构总结三.网络编程前戏1.什么是网络编程2.学习网络编程的目的3.网络编程的起源4.网络编程必备条件四.OSI七层协议1.引入:2.七......
  • 焦点科技编程挑战赛2022题解
    比赛说明:比赛在四个学校开展,南理南航南农和矿大。题目查找文本差异要求origin和dest中分别包含1000w+条数据dest对数据进行了打乱操作,即origin和dest中相同数据行的......
  • 数据分享|R语言逻辑回归、Naive Bayes贝叶斯、决策树、随机森林算法预测心脏病|附代码
    全文链接:http://tecdat.cn/?p=23061这个数据集可以追溯到1988年,由四个数据库组成。克利夫兰、匈牙利、瑞士和长滩。"目标"字段是指病人是否有心脏病。它的数值为整数,0=无......
  • Python基础之网络编程:1、C/S架构和B/S架构
    目录软件开发架构一、C/S架构二、B/S架构三、本质和区别软件开发架构规定了程序的请求逻辑、功能分块一、C/S架构c/s架构的组成:Client(客户端),Server(服务端)Client(客......
  • Python基础之网络编程:2、OSI协议之七层协议
    目录Python基础之网络编程一、网络编程前戏二、OSI七层协议简介:1、物理连接层2、数据链路层网络相关专业名词3、网络层4、传输层Python基础之网络编程一、网络编程前戏1......
  • 计算机网路编程理论
    计算机网路编程理论针对软件开发,目前所有市面上的主流软件,都基本上会使用网络进行通信,传输各种数据,作为软件开发人员,掌握网络编程理论和了解网络编程开发架构是必须的。......
  • Open Cascade 中的 AIS_InteractiveContext、V3d_Viewer 与 V3d_View 之间的关系
    转载请注明原文链接:https://www.cnblogs.com/mechanicoder/p/16892989.html1.前言本想通过Context与Viewer的多对一关系尝试实现三维视图图层、图元分类管理的功能,......
  • 网络编程基础
    网络编程基础软件开发架构软件开发结构:程序员在编写软件时候应该遵循的架构设计规定了程序的请求逻辑,功能划分模块等等1.C/S架构client:客户端Server:服务端'''......
  • 网络编程前戏
    今日内容概要软件开发架构架构发展趋势网络编程前戏OSI七层协议各种重点协议今日内容详细软件开发架构规定了程序的请求逻辑、功能分块1.C/S架构 Client:......