나는 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);
}