【问题标题】:How do i find if an object is before or after a waypoint?我如何确定一个物体是在航点之前还是之后?
【发布时间】:2012-12-15 11:52:49
【问题描述】:

我正在为一个学校项目开发一款赛车游戏。 使用 Visual Studio 10 专业版和 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. 当它到达终点并重置时,它会停止在第一个航点上触发。

所以我的问题:

这是一个好方法吗?

我做对了吗?

【问题讨论】:

  • 你应该accept an answer,或者如果没有人能说服你,请评论给出的答案,以获得更好的答案。

标签: c++ irrlicht


【解决方案1】:

您的代码测量从当前路径点到下一个路径点的向量距离,即玩家的距离。但是,如果两个连续段的向量(例如)成直角,则该算法可以一次跳过多个路点。 (即,如果您将线划过下一个路点,它可能会一直延伸到路中间,这意味着玩家可以在驶向该路点时来回穿过这条线)。

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

(或者您可能只需添加更多航点就可以逃脱)

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

next_waypoint = (vehicle->nextWaypoint + 1) % num_waypoints;

【讨论】:

  • 啊,Mod 检查一下,我知道我忘记了什么。谢谢你。
【解决方案2】:

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

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

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

【讨论】:

  • 您的代码对当前问题没有帮助,但它确实帮助我解决了另一个问题,我的代码中有一些其他问题。谢谢你
【解决方案3】:

发现我的原始代码可以正常工作,问题出在航点上。

使航路点易于查看,并且所有航点都彼此太近,因此kode在同一地点重复了很多次。

于是把航路点之间的距离拉长了,把它们做成了一条轨道,一切都开始像我想要的那样工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多