勤能补拙,Expter

成都游戏Coder,记录游戏开发过程的笔记和心得!

游戏中常见的几种追踪算法

    所谓追踪,相对于另外一个角色来说是逃跑,首先需要做出追和逃跑的决策判断。

1.坐标追踪
       也是最基本追逐方式,他根据要追踪对象的坐标来修改追踪者的坐标,使两者的距离逐渐缩短。
        一个简单的例子:
              Point   m_pPrey;   /// 被追踪者
              Point   m_pAtta;   ///  追踪者
        对于追踪者来说:   新位置 =  旧位置 +  XY速度 ; 
            
 1if( m_pAtta.x < m_pPrey.x )
 2    m_pAtta.x ++;
 3else if( m_pAtta.x > m_pPrey.x )
 4    m_pAtta.x --;
 5
 6
 7if( m_pAtta.y < m_pPrey.y )
 8    m_pAtta.y ++;
 9else if( m_pAtta.y > m_pPrey.y )
10    m_pAtta.y --;

 
2.视线追踪
      视线追踪方式,主要是描述每一时刻都追踪者会沿着被追逐者之间的直线方向运动。如图所示:
                    
     通过图可以更好描述此问题,此问题的求解关键在于求出连接追踪者与猎物之间的直线,可以通过向量知道:2个向量想减即可得到。
     可以分别用追踪者与猎物的位置坐标构造出两个向量,假设b 代表追踪者位置向量,a 代表猎物位置向量。做向量减法a-b 便得到了向量c,将c 的起点置于追踪者的位置上,就得到了一条指向猎物的向量c. 此时,令:

     追踪者X 方向速度 / 追踪者Y 方向速度    =     c 向量x 轴分量/   c 向量y 轴分量 .即可求解。

3.拦截追踪
      所谓拦截追踪,如果考虑的是被追逐的目标太远,如果2者速度一样,或者相差不大,有可能很难追上,玩过实况足球的都知道,如果采用上面的2中追逐方式,可能错过最佳的防守位置。下面是拦截追踪的一个示例图:

   
    对于追踪者来说,他只需要知道被追踪者的位置,方向与速度,讲会计算一个最佳的拦截位置。然后你会发现这只是一个简单的追踪问题。且需要的时间t最少。


整个3种追踪的源码代码 以及 demo都共享:
/Files/expter/chase.rar

下一篇通过实例demo来记录学习的聚类算法:

posted on 2009-10-09 23:57 expter 阅读(4776) 评论(2)  编辑 收藏 引用 所属分类: 算法与数据结构Ai

评论

# re: 游戏中常见的几种追踪算法 2009-11-08 16:06 zhangbing

hehe 不错的东西  回复  更多评论   

# re: 游戏中常见的几种追踪算法 2010-05-17 17:42 hyx

有没有用JAVA写的追踪算法?  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理