게임에서 차량 프로그래밍하기
(wassimulator.com)- 게임에서 차량 구현은 진짜 물리 엔진 대신 플레이 경험을 중시함
- 레이싱 및 시뮬레이터 게임마다 차량 조작 방식과 몰입감에 차이가 큼
- 차량 시뮬레이션은 엔진/기어박스, 타이어, 섀시의 세 가지 구성 요소로 구성됨
- 타이어 모델링과 슬립(스립) 개념이 현실적인 주행감을 구현하는 핵심임
- 개발자는 게임 컨셉에 맞는 단순화 및 추상화 수준을 스스로 정의해야 함
차량이 게임에서 특별한 이유
게임 내 차량은 다양한 장르에서 중요한 경험적 요소로 활용됨
비현실적인 조작과 현실적인 운전 시뮬레이션 모두 “운전하는 느낌”을 전달함
예를 들어 Mario Kart와 Assetto Corsa는 근본적으로 다른 경험을 지향하지만, 모두 차량 프로그래밍의 본질은 동일함
실제의 물리 법칙을 정확히 구현하기보다, 유저가 기대하는 운전의 감각을 어떻게 전달할지에 중점을 둠
개발자의 목표는 ‘정확한 시뮬레이션’보다 의도한 경험을 설계하는 것임
초기 시도와 교훈: AV Racer
AV Racer 개발 초기에는 단순 뉴턴 역학 모델로 차량을 움직였으나, 실제 차량 같은 감각을 주지 못했음
회전, 드리프트, 각속도 등 다양한 하드코딩과 파라미터 튜닝을 반복
경험적인 “슬라이드” 감각을 연출했지만, 극단 상황이나 실제 운전자의 기대에는 미치지 못함
실제 차량 물리와 운전자 경험 이해가 부족하면, 근본적인 한계에 봉착함
결국 제대로 구현하기 위해선 현실의 차량 역학 원리를 연구하게 됨
게임용 차량 시뮬레이션의 구조
게임 내 차량은 엔진(및 기어박스), 휠/타이어, 섀시라는 세 가지 개념적 요소로 나눌 수 있음
엔진(기어박스 포함)
- 스로틀, 기어 변경 등 입력을 받음
- 토크와 RPM 산출, 기어비에 따라 변환
- 바퀴와 상호 피드백 작용(즉, 엔진-바퀴 간 양방향 동기화)
타이어(휠 포함)
- 엔진토크, 브레이크, 스티어링, 중량, 노면 마찰 등 다양한 입력 수용
- 타이어-노면 접촉점에서 모든 힘이 발생
- 타이어 모델링(예: Pacejka Magic Formula)로 현실적인 힘 구현
섀시
- 물리 엔진의 단단한 바디 역할
- 타이어의 힘, 공기 저항, 중력, 충돌 등 외부 영향에 반응
- 차량 전체 움직임 결정 및 타이어 하중 변동에 영향
구성 요소 | 주요 입력 | 주요 출력 |
---|---|---|
엔진/기어박스 | 스로틀, 변속기 입력, 바퀴 속도 | 회전 토크, RPM |
타이어 | 엔진 토크, 브레이크, 스티어링, 하중, 마찰 | 섀시 힘, 엔진-휠 동기화 |
섀시 | 타이어 힘, 에어로다이내믹스 결과 | 휠 하중, 전체 이동 |
실제 차량처럼 모든 세부 물리를 100% 정확히 구현하는 것은 비현실적임
실제 자동차 회사의 연구소가 아닌 한, 대부분의 게임 및 시뮬레이션은 블랙박스 모델과 공식, 단순화된 접근법을 사용함
따라서 핵심은 무엇을 생략하고 무엇을 강조할지 설계자가 결정하는 것임
엔진 및 드라이브트레인 설계
엔진(토크 산출 핵심)
- 실제로는 매우 복잡하지만, 코드상으로는 입력(RPM, 스로틀) → 토크 출력의 단순한 블랙박스 모델로 구성 가능
- 토크/출력 곡선은 수치나 그래프로 파라미터화하여, 다양한 성향의 엔진을 시뮬레이션 가능
- 예시: Desmos 등으로 곡선 직접 설계, “엔진의 성격”을 조정할 수 있음
기어박스
- 기어비 테이블을 사용하여 간단하게 구현
- 기어 변속이 차량의 가속 특성, 최고 속도 등을 결정
- 단순하지만 플레이 경험에 큰 영향을 미침
기어 | 비율 |
---|---|
R | -2.92 |
N | 0 |
1 | 2.50 |
2 | 1.61 |
3 | 1.10 |
4 | 0.81 |
5 | 0.68 |
엔진 & 휠 RPM 동기화
- 엔진 RPM과 구동 휠 각속도는 상호 연동
- 두 상태 변수의 차이를 기반으로 미분방정식으로 수치적으로 계산
- “목표치까지 쫓아가는” 형태로 프레임마다 점진적 일치 구현
이를 통해 아케이드형이나 시뮬레이터형 모두 확장 가능
플레이어가 엔진 각종 파라미터(예: 캠 프로필, 터보 등)를 조정할 때, 사운드나 출력 곡선 변화와 연결
실제 그대로의 엔진 운동을 흉내내지 않아도, 원인-결과의 명확성을 전달하며 상호작용 경험 강화
타이어 모델
타이어의 역할
- 차량이 실제 도로와 접촉하는 유일한 부분
- 가속, 제동, 코너링 등 모든 힘은 타이어 접지면에서 생성
- 탄성 변형과 마찰 특성을 중심으로 힘 생성
롱기튜드(가속/제동) 힘 & 슬립 비(Slip Ratio)
- 타이어는 정지 마찰 상태에서 최대 접지력 제공, 한계를 넘어서면 동적(슬립) 마찰로 전환
-
슬립 비는 바퀴 회전 속도(구동/제동)와 지상 이동 속도 차이로 산정
- 슬립 비 = (휠 각속도 - 자유 회전 각속도) / 자유 회전 각속도
- 일반적으로 가속시 바퀴가 지상보다 빠를 때, 제동시 느릴 때 슬립이 발생
- 슬립 비에 따른 접지력 변화는 그래프로 곡선을 그릴 수 있음
- 특정 구간까지는 접지력 증가하다가 극대점 이후 접지력 급감
슬립 비를 반영한 힘 산출 공식 (Pacejka Magic Formula 등)
- 슬립 비를 입력으로 받아 복잡한 곡선(파라미터화된 사인/아크탄젠트) 산출 공식 활용
- 타이어별로 개별 계산 필요
레터럴(코너링) 힘 & 슬립 각(Slip Angle)
- 코너링 중에는 접지면이 변형되면서 슬립 각이 발생
- 슬립 각 = 타이어 실제 진행 방향과 바퀴가 가리키는 방향 간 각도 차이
- 슬립 각이 커질수록 점차 더 많은 접지력이 발생했다가, 한계점을 넘으면 미끄러짐
- 슬립 각-접지력 관계 역시 특유의 곡선을 그림
- 하중, 마찰, 동적 변화 등 다수의 파라미터가 영향을 미침
언더스티어/오버스티어 등 현상
- 언더스티어: 전륜 슬립 각이 후륜보다 클 때, 차가 의도보다 덜 돎
- 오버스티어: 후륜 슬립 각이 더 커질 때, 차의 뒷부분이 바깥으로 미끄러짐
- 올바른 타이어 모델만 있으면, 이러한 핸들링 특성은 자연적으로 발생
롱기튜드/레터럴 힘의 상호 제한 (Friction Circle)
- 타이어가 가속/제동 및 코너링 두 방향에 동시에 힘을 사용할 때, 각 방향의 최대치가 서로 영향을 미침
-
마찰원(circle/ellipse) : 두 힘 벡터의 합은 한도를 넘지 못함
- (F_{x}^2 + F_{y}^2 \le (\mu F_{z})^2)
- 예: 급브레이크+급조향 시 제어력을 잃기 쉬움
- 현실의 타이어는 곡선/비선형이므로, 실제 데이터에 맞춰 파라미터 보정 필요
코드 내력
- 각 타이어에서 롱기튜드/레터럴 힘을 개별 산출
- 두 벡터를 합쳐 가상의 마찰원 내에 정규화(scaling)
- 동적으로 파라미터를 조정하면, 고도의 핸들링 변화도 쉽게 실험 가능
전체 차량 물리엔진 통합
- 타이어 힘 + 서스펜션 출력 + 외부 영향(중력, 드래그 등)을 섀시에 집계
- 뉴턴의 운동 법칙에 의해 매 프레임 가속/속도 갱신
확장 가능한 추가 요소
- 서스펜션 기하학: 캠버, 캐스터 등
- 고급 타이어 역학: 온도, 마모, 팽창, 하중 변화 등
- 에어로다이내믹스: 다운포스, 드래그, 자동 조절 스포일러
- 구동계/차동장치, ABS, ESP, 조향 제한 등
- 필요시 여러 책 참고: Race Car Vehicle Dynamics(Milliken), Mechanics of Pneumatic Tires(S.K. Clark)
결론
이상의 모델만으로도 실제 차량과 유사하게 동작하는 게임용 차량의 근간을 구현할 수 있음
추가적인 디테일은 개발 목표와 필요에 따라 확장 가능
핵심은, 현실에서 얻은 기본 원리의 단순화/추상화와 플레이 경험 중심의 설계 철학임
궁금한 점이나 의견/수정 제안은 연락 바람
Hacker News 의견
-
흥미로운 점은 실제로 엔진이 가장 많은 움직이는 부품을 갖고 있지만, 코드에서는 오히려 자동차 시뮬레이션 전체 중에 가장 단순한 부분임을 말하고 싶음. 엔진의 핵심 역할이 토크 계산기이기 때문임. 여러 입력을 받아 회전 토크라는 하나의 출력만 내는 블랙박스의 느낌임. AngeTheGreat의 엔진 시뮬레이터 비디오 시리즈를 꼭 추천하고 싶음. 실시간으로 동작할 정도로 최적화되어 있고, 실제 같은 엔진 소리까지 만들어내는 걸 보면 정말 놀라움을 느낌. AngeTheGreat 엔진 시뮬레이터 영상 참고
-
게임 Automation은 엔진 빌더/시뮬레이션이 매우 깊이 있게 구현되어 있음. 각종 엔진 실험이 정말 재미있으며, 사운드 시뮬레이션 부분도 AngeTheGreat의 영상에서 다뤄지는 개념을 일부 차용하고 있음
-
Houdini에서 큐브를 애니메이션하는 클래식 예시가 떠오름. 실시간 내연기관 시뮬레이션에서 예상밖의 일이 벌어지는 재미가 있음. Houdini 큐브 애니메이션 예시
-
내가 프로그래밍을 시작하게 된 계기는 아버지가 BASIC으로 엔진 시뮬레이터를 작성하시는 것이었음. 기계공학 엔지니어였던 아버지는 여러 엔진 설계의 토크 곡선을 비교하고 싶어했음. CIRCLE과 LINE 명령어로 피스톤, 크랭크 어셈블리, 크랭크샤프트의 1초 미만 프레임으로 움직이는 와이어프레임을 그려낼 때, 컴퓨터로 무언가를 그리고 움직일 수 있다는 사실이 내게 충격을 줬음. 이 분이 더 나은 레이싱카 사운드를 만들기 위해 같은 일을 했다는 사실이 정말 인상적임
-
EV 모터는 실제로 매우 단순하지 않음? 엔진은 작은 폭발을 활용해서 토크를 만드는 것이 비싸고 복잡함. 그래서 게임 속 대부분의 자동차가 EV처럼 움직이는 게 아닌가 궁금함. 혹은 ICE(내연기관)를 더 정확하게 시뮬레이션하지 않는다면 말임
-
-
내가 Army of Two에서 차량 시뮬레이션 전체를 담당했었음. 이 글은 좋은 입문서임. Pacejka의 타이어 모델과 트랜스미션 디퍼렌셜을 적용해서 큰 도움이 되었음. 이 외에도 안티롤바 물리 시뮬레이션과 서스펜션이 “재미있는” 운전감을 만들어주는 데 엄청 중요하다는 점이 의외임. 이게 빠지면 주행이 미끄럽고 몰입이 어려워짐. 데모 영상에도 그 느낌이 있음. 안티롤바와 서스펜션을 구현하지 않으면 차가 쉽게 전복되어서, 타이어 미끄러짐이나 표면 마찰 설정만 자꾸 만지작거리게 되는데, 오히려 운전 경험이 나빠짐
-
이 정보 진짜 고마움! 안티롤바가 기초 모델에서 그 정도로 중요하다는 건 몰랐음. 관련 내용을 더 공부하고, 잘 구현되면 글에도 업데이트할 계획임
-
최근 내 차 서스펜션 쪽에 문제가 생겨서 ‘재미없는 운전’을 직접 체험하게 됐음. 이 말에 더 공감이 생김
-
-
이 내용이 Flightle 게임을 만들면서 내가 직접 깨달은 것과 매우 비슷함. 모바일용 횡스크롤 비행 시뮬레이터를 했는데 비행기 움직임이 너무 어색해서, 분노에 차 “이게 뭐가 어렵지?” 싶어 직접 만들기 시작함. 비행 원리 공부를 하다보니, 적절한 추상화 레벨이 중요함을 알게 됨. 너무 비현실적이면 재미 없고, 너무 사실적이면 플레이 밸런싱이 어려움. Flightle 링크
-
이미 댓글 수정하기엔 늦었지만, 자세한 경험 정리를 따로 글로 모아봤음. 사이드스크롤 비행 시뮬레이터 제작기 봐주길 바람. 참고로, 나중에 비행기를 점 형태에서 두 날개가 막대기로 연결된 구조로 바꿔봤는데, 재미있게 튜닝하는 데 고생 엄청 했음. 기술 있는 사람이라면 더 잘 했을 것 같음
-
게임 재미있게 즐겼음. 데스크톱 사용자라면 마우스 스크롤 휠로 슬라이더 조작하게 하면 어떨지 제안하고 싶음
-
-
예전에 iOS용으로 차량과 드리프트를 시뮬레이션하는 게임을 만든 적 있음. SpriteKit 기반이었지만, 2D 게임 엔진이면 어디서든 쉽게 구현 가능함. 기본 아이디어는 앞에 바퀴 두 개를 핀 조인트로 사각형 차체에 연결하고, 바퀴에 힘을 가하는 방식임. 힘의 각도는 다음과 같이 계산함: x = force * cos(bodyRotation + wheelRotation) y = force * sin(bodyRotation + wheelRotation) 여기에 스키드 파티클도 추가함. 드리프트는 바퀴와 차체 댐핑 값을 조절하며 구현했음. Drift Mania Infinite Car Racer 앱
-
게임 정말 느낌 있음! 즉시 시작되는 점이 마음에 들었음. 스키드 파티클은 실용적임. 비주얼도 좋음. 하지만 내겐 난이도가 너무 높았음. 벽에 부딪혀도 리셋되지 않는 “젠 모드” 같은 걸 추가해주면 더 많이 플레이할 수 있을 것 같음
-
게임 정말 멋짐. 앱 마켓이 워낙 경쟁이 심한데, 22개나 되는 평가를 받은 게 대단함. 홍보는 어떻게 했는지 궁금함
-
“이 게임은 놀라운 그래픽을 제공합니다...” 자기 비하적인 유머가 정말 귀여움. 바로 다운로드 중임
-
-
이 글은 진심으로 흥미로웠음. 타이어 모델 부분만으로도 여러 번 읽겠음. 시뮬레이션이나 리얼리티 같은 거 다 필요 없이 재미만 위해서라면, 1980년대 아케이드 게임 Super Sprint만한 게 없음. Super Sprint 게임 정보
-
내 노트에 저장해둔 관련 강연 자료들 중 일부를 복사/붙여넣기 함: Hamish Young, ‘Just Cause 4’ 차량 물리 및 타이어 다이내믹 Vehicle Physics and Tire Dynamics in 'Just Cause 4' Jan Erik Steel & Patrick Donnelly, ‘Skylanders’에서의 슈퍼차지드 차량 물리 Supercharged! Vehicle Physics in 'Skylanders' Edward Pereira, 오프로드 과학 관련 강연 The Science of Off-Roading Jared Cone, ‘Rocket League’의 물리학 It IS Rocket Science! The Physics of 'Rocket League' Detailed
-
글 자체는 멋지지만, 서두 부분이 약간 혼란스러웠음. 자동차가 게임에서 다양한 비현실적 경험을 제공한다고 말하는데, 총기는 그렇지 않다고 주장하는 점에 의문이 듦. 사실 게임에서는 다양한 비현실 총기가 넘쳐남. 게다가, 우리가 자동차 운전에 대한 기대를 직접 경험이 아니라 미디어나 문화적 간접 경험에서 얻는다고 주장하는데, 오히려 총기에 더 해당하는 이야기 아님? 점프 같은 것도 게임에서 매우 다양한 방식으로 처리되는데, 점프에 대한 내 기대는 실제 ‘점프해본 경험’에서 오는 게 훨씬 강한 편임
-
FPS 게임 제작 경험이 많지 않은 듯함. 실제 총기는 게임 속 경험과 다름. 게임이 실제 총기와 똑같았으면 훨씬 재미없고 답답했을 것임. 레이싱 게임도 마찬가지로, 재미를 위해 현실을 적당히 비틀어야 함
-
이 주제는 ‘리얼리즘’이 아니라 ‘그럴듯함(베리시밀리튜드)’의 문제라고 생각함. 플레이어가 ‘믿을 수 있는’ 경험을 만드는 게 중요함. 게임 속 총기는 실제와 다르지만, 힘 있고 위협적으로 보이는 판타지를 우선함. 점프 역시 현실적 근거는 없지만, 게임 목적에 가장 잘 어울리는 형태로 디자인됨. 반면, 자동차처럼 물리적 사실성과 시스템화가 가능한 영역에서는 현실적 묘사를 지향하며, 산업계 시뮬레이션과 비교할 수 있을 정도임. 그러나 인간 움직임, 경제 시스템, 전투 흐름 등은 그 정도 현실적 접근이 어렵기 때문에 훨씬 만화적인 표현이 많음. 게임 디자이너는 플레이어 기대와 전체 게임 목표에 부합하는 방향으로 적절한 절충을 해야 함. 너무 자세한 리얼리즘만 추구하다 전체 구조를 망치는 것은 흔한 함정임
-
FPS 예시는 급하게 무대에서 떠올렸던 것인데, 곰곰히 생각해보니 좋은 예시는 아님을 깨달음. 의견 지적 고마움
-
-
언덕, 경사로, 서스펜션 같은 요소가 빠진 것 같음. Unreal Engine에는 아주 단순한 차량 데모도 있고, 실제 서스펜션 모델이 있는 데모도 존재함
-
발표와 글 마지막 부분에 실제 엔진 현황을 보여주는 짧은 영상이 있고, 영상에는 언덕과 경사로 등 다양한 지형이 구현되어 있음. 발표에서는 단순한 평면 그리드를 사용함. 서스펜션도 구현되어 있지만, 자동차 전용 특수 문제라기보단 단순히 무게를 버틸 수 있게 만드는 일반적인 기능이라, 발표 분량과 흐름상 깊게 다루지 않았음
-
Wassim이 QA에서 언급했듯, 서스펜션은 물리 엔진이 알아서 처리해주고, 그 영향이 타이어 부하에 반영되어 타이어 힘에도 자연스럽게 영향을 주는 구조임
-
-
Rocket League의 차량 물리에 관한 좋은 GDC 강연이 있음. Rocket League 물리 강연 참고. 참고로, 본인은 Rocket League에서 게임 클라이언트는 아니고 다른 부분을 담당했던 팀원이었음
-
이 글을 읽으며 레이싱 물리학에 관한 좋은 강연이 떠올랐음. Andre Marziali - Physics of Racing