如何查找一个物体是在一个航路点之前还是之后



我正在为一个学校项目制作赛车游戏。使用Visual studio 10 pro和Irrlicht。抱歉语法不好>>,这是我的第一个问题,所以不确定它做得是否正确。

我希望它的工作方式是,我在赛道上的不同点上设置路线点,然后我运行我的路点检查,看看一辆车是否经过了它的下一个路点(它"需要"经过的下一路点),如果是,它会更新下一个路点,否则什么都不更新。

我希望这样做的方法是,我做一个从n到n+1的向量,然后找到垂直于第一个向量的向量。然后我看看物体是在这个向量的前面还是后面。我发现了一个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. 当它到达终点并重置时,它将停止在第一个路点上触发。

所以我的问题:

这样做好吗?

我做对了吗?

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

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

(或者你可能只需要添加更多的路点就可以了)

至于为什么当你绕圈时它不起作用,你似乎只是在路点上加一个,然后找到下一个。你需要对总进行模运算

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

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

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

不便:结果可能因道路弯曲而有所不同。我建议你使用我描述的第一种方法。

发现我原来的代码在工作,问题出在路点上。

使路线点很容易被看到,而且所有路线点都离得太近了,所以kode在同一地点重复了很多次。

因此,让航路点之间的距离变长,并将它们变成一条轨道,一切都开始像我想要的那样工作。

最新更新