如何找到一个物体在航点之前或之后?

时间:2012-12-15 11:52:50

标签: c++ irrlicht

我正在为一个学校项目开展赛车游戏。 使用Visual Studio 10 pro和Irrlicht。 抱歉语法错误>。>,这是我的第一个问题,所以不确定它是否正确。

我希望它如何工作是我在赛道上的不同点制作航点, 然后我运行我的航点检查以查看汽车是否超过了下一个航点(下一个“需要”过去),如果是,那么它会更新下一个航点,否则没有。

我希望这将起作用的方式是,我制作一个从n到n + 1的向量,然后在n处找到与第一个向量垂直的向量。然后我看看对象是在该向量的前面还是后面。 我发现Gamedev.net forumpost帮助我完成了这项功能:

void Engine::checkWaypoint(Vehicle* vehicle)
{
  btVector3 vector = waypoints[vehicle->nextWaypoint];
  // n
  btVector3 nextVector = waypoints[vehicle->nextWaypoint + 1];
  // n+1
  vector = nextVector - vector;
  // First vector
  btVector3 pos = btVector3(vehicle->position.X,vehicle->position.Y,vehicle->position.Z);

  float product = vector.dot(pos - waypoints[vehicle->nextWaypoint]);
  // positiv = before, negative = behind

  if(product < 0)
    vehicle->nextWaypoint += 1;
}

目前的错误是:

  1. 更新下一个点而不会超越新点。

  2. 当它到达终点并重置时,它会停止在第一个航路点上触发。

  3. 所以我的问题:

    这是一个很好的方法吗?

    我做得对吗?

3 个答案:

答案 0 :(得分:1)

通常,在比赛游戏中,您必须在检查站才能进行验证:您只需检查汽车是否离检查站足够近。所以,我认为以下伪代码是有效的:

if( car is_near current_checkpoint )
    current_checkpoint = current_checkpoint->next_checkpoint;

is_near: return distance(car, current_checkpoint) < some value

对于距离测试,您可以使用简单的圆形(如伪代码所示),也可以测试汽车是否碰到检查点的边界框(或检查点内的框) ),这取决于你的检查站的制作方式。

否则,您可以使用从检查点到其关注者的所有行创建的曲线,然后在其上找到最接近的行,您可以从中找到下一个检查点。例如:

                        o--o
                       /    \
    o-----------------o      \
   /                          \  <-- your track: S = start
  /                            o                 E = end
 /        o---o        X      /                  o = checkpoint
S        /     \       .     /                   X = car
        /       o------.----o
       /                  ^
   E--o                   |
                closest road from the car

不方便:结果可能会因道路曲率而异。 我建议你使用我描述的第一种方法。

答案 1 :(得分:1)

您的代码测量从当前路点到下一个传感器的距离,玩家是。然而,如果两个连续段的矢量(例如)在直角处,则算法可以一次跳过多个路点。 (即如果你划过下一个路点的线,它可能会向下延伸到道路中间,这意味着玩家可以前后穿过它,同时朝着那个方向点行驶。)

某种类型的边界体积可能会起作用,要么是到航路点的距离(检查它是否小于道路宽度的2倍),或者是你在点之间计算的矢量距离

(或者你可能只是添加更多的航点)

至于为什么它在你上圈时不起作用,你似乎只需在路点上添加一个来寻找下一个。您需要以总计:

为模计算
next_waypoint = (vehicle->nextWaypoint + 1) % num_waypoints;

答案 2 :(得分:0)

发现我的原始代码正常工作,问题在于路标。

使得航点很容易看到并且所有航点都彼此太靠近,所以kode在同一地点重复了很多次。

因此,使航点之间的距离更长,并使它们成为轨道,一切都开始像我想要的那样工作。