Grand Theft Auto IVとV以外のゲームが実装しているゲームを調査しているときにこの(古い)質問に遭遇しましたが、制御可能なオーバーステアを実現するための適切な答えがあります。私はGrand Theft Auto Vの運転モデルをいじくり回しただけの経験がありますが、この情報は、最も現実的な運転モデルに適用できるはずです。
ほとんどのドライビングゲームで発生するように見えるのは、車のステアリング出力がプレーヤーの入力に直接リンクされていることです。これは、ある種の(時間的な)スムージングが使用されている場合でも同様です。これは、鈍い感じまたはぎくしゃくした感じを引き起こします-そして、車はコントロールを手放した後、それ自体を修正しません。これは、実際の車とは対照的です。実際の車は、ホイールに力を加えた後に車が中央に集まる傾向があります。一部のゲームでは、処理モデルを変更したり、アーケード処理モデルを作成したりして、これを修正しようとします。
Grand Theft Auto Vで観察できることは、ユーザーのステアリング入力がステアリング出力に直接リンクされていないことです。車両は、現在の速度ベクトルに向かって単独で操縦します。これは、わずかなオーバーステアの状況を強制し、ステアリングホイールを観察したときに表示されます。何も入力しなくても、それらは自分でカウンターステアします。次に、ユーザー入力がこれらの「自然な」修正の上に追加されます。
ただし、このアプローチの欠点は、車がベタベタしすぎて、パワースライドやドリフトに入るには少し頑固だと感じられることです。そのため、このカウンターステア値は、特定の角度に制限できます。
この理論は、ステアリングシステムを再実装し、それを元の動作と比較することで検証できます。
- 入力を出力に直接リンクする場合、速度ベースのステアリング入力リミッターを適用したとしても、車両の制御は非常に困難です。
- 自然なカウンターステアを追加する場合、動作はゲームの実装とほぼ同じですが、車は「安定」しています。
- 15度の制限をカウンターステアに追加すると、動作はほぼ同じになります。
ここで覚えておくべきことは、Grand Theft Auto Vがここでは「理想的」と見なされていることです。ただし、このシステムを実装する他のゲームはまだ見つかっていません。
あなたがいくつかのコードに興味があるなら、ここに私の実装のスニペットがあります。
// Returns in radians
float Racer_calculateDesiredHeading(float steeringMax, float desiredHeading,
float reduction) {
desiredHeading *= reduction;
float correction = desiredHeading;
// Get the relative velocity vector
Vector3 speedVector = ENTITY::GET_ENTITY_SPEED_VECTOR(vehicle, true);
if (abs(speedVector.y) > 3.0f) {
// Simplify it to an angle
Vector3 target = Normalize(speedVector);
float travelDir = atan2(target.y, target.x) - static_cast<float>(M_PI) / 2.0f;
if (travelDir > static_cast<float>(M_PI) / 2.0f) {
travelDir -= static_cast<float>(M_PI);
}
if (travelDir < -static_cast<float>(M_PI) / 2.0f) {
travelDir += static_cast<float>(M_PI);
}
// Correct for reverse
travelDir *= sgn(speedVector.y);
// Limit to some degree, R* uses 15 degrees
travelDir = std::clamp(travelDir, deg2rad(-15.0f), deg2rad(15.0f));
// User input deviation
correction = travelDir + desiredHeading;
}
return std::clamp(correction, -steeringMax, steeringMax);
}