c++ - 我如何找到一个对象是在航路点之前还是之后?

标签 c++ irrlicht

我正在为一个学校项目开发一款赛车游戏。 使用 Visual Studio 10 专业版和 Irrlicht。 抱歉语法不好 >.>,这是我的第一个问题,所以不确定它是否做对了。

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

我希望这会起作用的方法是,我创建一个从 n 到 n+1 的 vector ,然后找到与 n 处的第一个 vector 垂直的 vector 。然后我看看对象是在那个 vector 的前面还是后面。 我找到了一个 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. 当它到达终点并重置时,它会停止在第一个航路点触发。

所以我的问题:

这是执行此操作的好方法吗?

我做对了吗?

最佳答案

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

某种边界体积可能会起作用,可以是到航路点的距离(检查它是否小于道路宽度的 2 倍),或者到您在点之间计算的 vector 的距离。

(或者您可能只需添加更多航路点即可)

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

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

关于c++ - 我如何找到一个对象是在航路点之前还是之后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13891923/

相关文章:

c++ - C++底层工作中的迭代器

android - Android 上的 Irrlicht 帧速率低

c++ - 3D 网格中的 block 附件

linux - Crystalspace vs. Irrlicht vs......?

geometry - 为什么三角形被剪裁在这个网格中?

c# - 使用 .Net 4.0 时出现 PInvoke StackImbalance 错误,但使用 .Net 2.0 时则不会

c++ - 为什么 stdlib 中的 rand 不遵循大数定律?

c++ - 在 boost 二进制文件上使用显式位置编译 boost 标志

C++ 显式函数签名