4

私は学校のプロジェクトのためにレーシングゲームに取り組んでいます。Visual Studio 10 Pro、およびIrrlichtを使用します。文法が悪いのでごめんなさい>。>、そして私の最初の質問なので、それが正しく行われたかどうかはわかりません。

私がそれを機能させたいのは、トラック上のさまざまなポイントでウェイポイントを作成し、ウェイポイントチェックを実行して、車が次のウェイポイントを通過しているかどうかを確認することです(次に通過する必要がある場合)。次のウェイポイントを更新しますが、それ以外は何も更新しません。

これが機能することを期待する方法は、nからn + 1までのベクトルを作成し、nで最初のベクトルに垂直なベクトルを見つけることです。次に、オブジェクトがそのベクトルの前にあるか後ろにあるかを確認します。この機能を作成するのに役立つGamedev.netフォーラム投稿を見つけました。

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. 終了してリセットすると、最初のウェイポイントでのトリガーが停止します。

だから私の質問:

これはこれを行うための良い方法ですか?

私はそれを正しくしましたか?

4

3 に答える 3

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

不便:道路の曲率によって結果が異なる場合があります。私が説明した最初の方法を使用することをお勧めします。

于 2012-12-15T12:04:06.203 に答える
1

コードは、現在のウェイポイントから次のウェイポイントまでのベクトルに沿ったプレーヤーの距離を測定します。ただし、2つの連続するセグメントのベクトルが(たとえば)直角である場合、アルゴリズムは一度に複数のウェイポイントをスキップする可能性があります。(つまり、次のウェイポイントを横切って線を引くと、道路の真ん中を下って伸びる可能性があります。つまり、プレーヤーは、そのウェイポイントに向かって運転しているときに、そのウェイポイントを前後に移動する可能性があります)。

ウェイポイントまでの距離(道路の幅の2倍未満であることを確認してください)、またはポイント間で計算したベクトルまでの距離のいずれかで、ある種のバウンディングボリュームが機能する場合があります。

(または、ウェイポイントを追加するだけでうまくいくかもしれません)

ラップしたときに機能しない理由については、ウェイポイントに1つ追加して、次のウェイポイントを見つけるだけのようです。合計を法としてその計算を行う必要があります。

next_waypoint = (vehicle->nextWaypoint + 1) % num_waypoints;
于 2012-12-15T12:13:23.403 に答える
0

私の元のコードが機能していることがわかりました。問題はウェイポイントにありました。

ウェイポイントが見やすくなり、すべてが近すぎたため、同じ場所で何度も繰り返されていました。

それで、ウェイポイント間の距離を長くして、それらをトラックにしました、そして、すべてが私がそれを望んでいたように働き始めました。

于 2012-12-18T11:01:48.530 に答える