我正在计算机编程课程中学习人工智能作为模块,我的任务之一是编写有效的避障转向行为代码。我一直通过示例使用Matt Bucklands编程游戏AI来帮助我,但是我使用的框架却有很大不同。与其使用检测盒,不如使用探测器,因此它比“避障”更接近“避壁”功能。我有一个PointInBox函数,而不是LineIntersection函数,它具有一个Vector2D(触角)和一个Rect2D(障碍物)。代码遍历障碍物的大小,并检测该点是否发生碰撞。
检测到碰撞后,将计算出转向力以将特工推离障碍物
我遇到的问题是,我不知道我是否在PointInBox参数中使用了正确的变量,并且由于我不知道如何有效地使用Rect2D结构,所以无法计算转向力。
我尝试将不同的值附加到Rect2D变量“障碍”上,但我需要获取ClosestObstacle并将其在Rect2D周围进行规范化(我现在真的不知道如何写出我要解决的问题入门/中级编程方面的知识。
Vector2D w019435fSteeringBehaviours::ObstacleAvoidance(Rect2D obstacles)
{
CreateFeelers();
double DistToThisIP = 0.0;
double DistToClosestIP = MaxDouble;
ObstacleManager* Obstacle;
int ClosestObstacle = -1;
Vector2D SteeringForce, Point, ClosestPoint;
for (unsigned int flr = 0; flr < feelers.size(); ++flr)
{
for (unsigned int o = 0; o < Obstacle->GetObstacles().size(); ++o)
{
if(PointInBox(feelers[flr], obstacles))
{
if (DistToThisIP < DistToClosestIP)
{
DistToClosestIP = DistToThisIP;
ClosestObstacle = o;
ClosestPoint = Point;
}
}
}
if (ClosestObstacle >= 0)
{
Vector2D Projection = feelers[flr] - ClosestPoint;
SteeringForce = obstacles.normal * Projection.Length();
}
}
return SteeringForce;
}
我认为ClosestObstacle是至关重要的,必须成为障碍物的一部分,然后对其进行标准化并乘以投影长度。但是我无法让任何成员陷入障碍。
非常感谢您的帮助。