요약
1996년 어느 주말에 만든 2D 차량 물리 시제품이 GTA 자동차 시스템의 바탕이 됐습니다.
개발자 팻 커가 30년 전 자신이 짠 차량 물리 시뮬레이션을 자바스크립트로 다시 만들어 공개했습니다. Motion Lab이라는 이름으로 브라우저에서 직접 몰아 볼 수 있고, 작동 원리도 함께 풀어 썼습니다.
왜 중요한가
- 초기 GTA의 운전감이 어떤 단순한 모델에서 나왔는지 만든 사람이 직접 밝혔습니다.
- 정확한 물리보다 플레이하기 좋은 손맛을 일부러 택한 설계 판단을 보여 주는 사례입니다.
핵심 내용
- 1996년 8월 말 Atari ST에서 GFA BASIC으로 짠 와이어프레임 데모였고, 나중에 C로 옮겨 게임에 들어갔습니다.
- 바탕은 위치, 속도, 각도, 회전 속도를 계산하는 2D 강체 시뮬레이션(물체를 변형 없는 덩어리로 보는 방식)입니다.
- 작성자는 당시 게임들이 주로 점 하나로 움직임을 계산하고 회전은 임시방편으로 붙였다고 봤습니다.
- 타이어는 일부러 단순하게 만들어, 구르는 방향 저항은 작게 하고 옆으로 미끄러지는 저항은 크게 줬습니다.
- Motion Lab에서는 자동차, 우주선, 벽돌 세 모드를 숫자 키로 바꿔 같은 물체에 다른 힘을 줘 볼 수 있습니다.
HN 반응
- 많은 이용자가 GTA 1·2의 운전이 후속 3D 작품보다 재미있었다며 고마움을 전했고, 고전 자동차 물리 자료도 함께 소개했습니다.
- 그림이 난해하고 AI가 쓴 글 같다는 비판이 나오자, 작성자는 그림과 연결 문구만 기계로 만들고 나머지는 직접 썼다고 답했습니다.
2D 주행 모델의 기초를 이야기하면서 Marco Monster(2003)[1]를 빼놓을 수는 없습니다.
『Physics for Game Developers』(2001)에도 자동차 레이싱 시뮬레이션을 다룬 웃긴 장이 있습니다. 그 장의 대부분은 장면을 아주 세밀하게 구성하는 데 쓰입니다. 예를 들어 연료가 소모되면서 주행 중에 차의 무게중심이 달라진다는 점까지 짚어 줍니다. 그러고는 마지막에 대부분을 단순화하고 상쇄해 버려서, 독자 손에는 변수 몇 개만 남습니다.
[1] https://www.asawicki.info/Mirror/Car%20Physics%20for%20Games/Car%20Physics%20for%20Games.html
Brian Beckman 박사의 The Physics of Racing 시리즈도 잊으면 안 됩니다. 당시 그분은 마이크로소프트에서 Forza 비디오 게임 시리즈를 맡은 연구원이었습니다.
https://www.youtube.com/watch?v=I8GQCZgCNw8
저는 학부 때 프로젝트로 OpenGL 자동차 물리 시뮬레이션을 만들어 본 적이 있습니다(Claude가 나오기 전이었죠). 아주 재미있었습니다.
아, 맞아요. Physics of Racing 시리즈는 정말 훌륭했죠. 다시 찾아봐야겠네요. 저도 학부 때 깊이 파고들었는데 아주 재미있었어요.
죄송하지만, 이 글을 정말 좋아하고 이해하고 싶었는데 다이어그램은 쓸모가 없고 대부분 알아볼 수도 없어요.
코드가 하는 일을 그대로 읊는 데서 그치지 않고, 왜 이렇게 동작하는지, 어떻게 제대로 된 느낌을 냈는지를 더 알고 싶었어요.
LLM만 있으면 누구나 쓸 수 있는 블로그 글이 아니라, 작성자가 어떻게 이걸 해냈는지를 더 알고 싶었습니다.
다이어그램은 프로젝트 소스 코드를 보면서 작성했거나 (아니면 생성했거나[1]) 한 것 같고, 코드 문서화에서 거꾸로 가는 방식, 즉 코드를 이미 읽은 사람에게만 말이 되는 "사후 요약"을 내놓는 방식을 씁니다. 아직 코드를 읽지 않은 사람에게 코드를 소개하는 용도가 아니라는 거죠.
그렇긴 해도 제가 보기에 다이어그램은 프로젝트를 개괄하는 글로서의 이 기사와는 사실상 무관합니다. 기사를 읽을 때는 그냥 무시하셔도 됩니다.
프로젝트 소스 코드를 파고들 때 그 다이어그램을 보고 얼마나 형편없는지 답답해하시면 됩니다. :)
===
[1] LLM이 만든 코드 문서나 다이어그램은 문서를 코드와 같은 세션에서, 다만 나중에 쓸 때 이런 일이 자주 생깁니다. LLM은 문서를 선형 컨텍스트에서 앞선 작업 "다음에 오는 것"으로 보기 때문에, 문서의 독자도 문서를 읽기 전에 그 컨텍스트에 있던 내용을 이미 읽었다는 듯이 잘못 쓰는 겁니다. 점점 쌓이는 공유 컨텍스트가 있고 "뒤에 오는" 글이 그것을 암묵적으로 가리켜 자기 분량을 줄일 수 있다는 가정은, 긴 산문 한 편을 이어서 생성할 때나 대화 응답이나 책의 장처럼 사슬로 이어진 항목들을 생성할 때는 꽤 말이 됩니다. 하지만 서로 떨어진 글 조각들의 웹이나 그래프를 생성할 때는 통하지 않습니다. 대화형 베이스 모델을 파인튜닝해서 코딩 에이전트를 만들 때 생기는 근본적인 결함이고, 코딩 에이전트 하네스는 아직 이 문제를 제대로 다루지 못하고 있습니다.
"하나의 몸체, 세 가지 동작"
글 대부분도 생성된 것 같네요.
제 기억으로는 (맞습니다, 기계가 생성한) 다이어그램들을 이어 붙이는 짧은 글 몇 군데뿐입니다. 글을 서둘러 마무리하던 때였거든요.
나머지는 "손으로" 직접 썼습니다.
이렇게 LLM에 한 치라도 내주면 사람들은 전부 그런 식으로 만들었다고 생각해 버립니다. 요즘 세상에 나온 것들을 보면 그런 짐작도 무리는 아니고요.
구체적으로 어떤 점이 궁금하세요?
요약 기사에서도 말씀드렸듯이 핵심은 "교과서적인" 2D 강체 시뮬레이션("Brick" 계층)이고, Car 부분은 대체로 타이어에 어떤 힘을 가할지를 정하는 일입니다.
간단히 말해, 타이어는 앞뒤로 가는 건 "좋아하지만" (타이어가 향한 방향을 기준으로) 옆으로 가는 건 저항합니다.
타이어에 가하는 힘은 대략 마찰과 비슷하지만 완전히 같지는 않습니다(마찰은 많은 분이 생각하시는 것보다 이상하고, 사실 속도에 크게 좌우되지도 않습니다). 어떤 면에서 제 타이어 힘은 오히려 일종의 "점성 항력"처럼 동작합니다. 당시에도 이게 좀 미덥지 않다는 건 알고 있었고, "플레이할 만한" 동작을 최대한 단순하게 얻으려고 일부러 고른 일종의 "꼼수"였습니다.
맞아요. 방향을 아주 확실하게 잡아 주지 않으면 에이전트는 정말 알아볼 수 없는 다이어그램을 만들어 냅니다. "의사소통에서 가장 큰 문제는 의사소통이 이루어졌다는 착각이다."
GTA 1과 2는 자동차 물리가 정말 재미있었습니다. 그냥 돌아다니면서 경찰을 따돌리기만 해도 재미있었는데, 이후 시리즈의 3D 게임들은 저한테는 그 느낌을 제대로 살리지 못했어요.
GTA 2는 라디오가 최고였던 걸로 기억해요.
웃는 뱀파이어의 댄스!
저는 루니 갱 라디오에서 드럼 앤 베이스에 맞춰 소리 지르던 일본 소녀가 너무 좋아요!
"세상이 불타고 있어, 친구, 리튬을 삼키면!"
지금 해 봐도 조작감이 정말 좋네요! 역사도 마음에 듭니다. 제품 개발에서 "장난감" 프로토타입을 만드는 일이 왜 그렇게 중요한지를 보여 주는 훌륭한 사례예요. 짐도 없고 프로덕션 수준이어야 한다는 기대도 없이, 개별 개념을 따로 떼어 놓고 가지고 놀 수 있게 해 줍니다. 곧장 핵심으로 들어가는 거죠.
훌륭한 이야기고, 훌륭한 프로그래밍이고, 훌륭한 역학입니다.
감사합니다. 뭔가 얻어 가셨다니 기쁩니다.
동역학 모델은 없지만(자전거 모델을 씁니다) 주차 솔버를 만들었습니다.
http://truckslop.joshu.dev/
가능한 결과를 보여 주는 시각화가 정말 넋을 잃게 만드네요.
"콘 하나(Joshua)"는 해법을 찾기 전에 이것저것 탐색하는 모습이 장난 아니에요!
정말 재미있게 가지고 놀았어요.
프랙탈 솔버에 버그가 있는 것 같은데, 제가 잘못 쓰고 있는 걸 수도 있습니다. 빨간 영역에 콘을 놓으면 차량이 막힌다고 나오는데, 색이 거꾸로 되어 있거나 백엔드가 이상한 것 같아요. 몇 군데만 빼고 전부 빨간색이거든요.
그 밖에는 아주 재미있습니다. 솔버가 불가능하다고 한 트럭을 제가 주차시켰어요 :)
참고로 iPad의 Safari에서 썼습니다. 혹시 상관이 있을까 해서요.
근데 이거 정말로 뭔가를 풀고 있는 건가요? 늘 세미트레일러가 반쯤 삐져나온 채로 막혀 버리는 것 같은데요.
저는 이걸로 핸드브레이크 턴을 배웠어요.
그리고 얼마 지나지 않아 타이어가 얼마나 비싼지 알게 되면서 핸드브레이크 턴을 그만뒀죠.
그때는 GTA가 없었어서, 전설 같은 이야기로 배워야 했어요.
그리고 얼마 뒤에는 온갖 물리 법칙을 몸소 겪은 경험에 더해, 자동차 보험 자기부담금이 어떻게 돌아가는지도 알게 됐고요.
저는 GTA 1이 나오기 5년쯤 전에 핸드브레이크 턴을 배우다가 남의 주차장을 망가뜨린 적이 있습니다. 그런데 (우연히도) GTA를 개발한 던디에서 불과 몇 마일 떨어진 곳이었어요! 저는 Lemmings 레벨을 만든 사람들 몇몇과 같은 대학을 다녔습니다.
저는 타이어 가격도, 유압식이 아닌 핸드브레이크의 케이블이 닳는다는 것도 알고 있었어서, 스칸디나비안 플릭이나 눈 오는 날의 핸드브레이크 정도만 가지고 놀았습니다.
저는 몇 년째 틈틈이 이걸 구현하려고 해 왔는데, 정말 신경 쓰였던 건 저속에서(주차 공간에 후진할 때) 제 차량이 바퀴 방향과 다르게 옆으로 미끄러진다는 점이었습니다. 꼼수를 쓰지 않고서는 그 문제를 끝내 풀지 못했고, 그게 정말 짜증 났어요. 마지막으로 시도한 건 코로나 때였습니다. 동네 자선 가게에서 99펜스에 『The Multibody Systems Approach to Vehicle Dynamics - 2004』를 집어 왔어요. 저한테는 너무너무 어려운 책이었지만, 구글과 스택 사이트에 몇 가지 질문을 해 가며 단순화해서 괜찮은 핸들링을 만들어 내기는 했습니다. 하지만 그 저속 횡방향 움직임이 있다는 걸 알고 나니 또 접어 둘 수밖에 없었네요.
살면서 언젠가는 LLM이나 이 기사의 도움 없이 이걸 풀어내겠다고 마음먹고 있습니다.
공유해 주셔서 감사합니다.
흥미로운 문제네요. 왜 그런 부작용이 계속 생기는지 바로는 모르겠습니다.
꼭 해결하시길 바랍니다!
정말 멋지네요. 몇 달 전에 저도 Claude로 GTA 느낌을 2D로 다시 만들어 보고 싶었어요. 게임 만드는 법은 전혀 모르는데도요. 그런데 몇 주쯤 지나니 3D가 되어 있었고, 완전히 다른 물건이 된 데다 재미도 훨씬 못했습니다.
https://2e7b8cb5.city-driver.pages.dev - 시동 거는 것 잊지 마세요. 점화를 하고 차에 시동을 걸어야 합니다.
만드신 분께, 감사합니다. 저는 거의 20년 전에 친한 친구와 밤늦게까지 GTA 2 멀티플레이를 하면서 오랜 세월을 보냈습니다.
멋지고 작은 물리 엔진 감사합니다.
별말씀을요.