GN⁺: 2D 강체 충돌 해결 방법
(sassnow.ski)2D 강체 충돌 해결
문제 정의
- 마리오가 구름을 밟는 것부터 레이싱 게임에서 두 자동차가 충돌하는 것까지, 충돌을 다루는 것은 대부분의 비디오 게임에서 매우 중요한 부분임.
- 이 블로그 시리즈에서는 물리 시뮬레이션의 실제 수학과 물리학을 다룰 예정임.
- 비디오 게임은 이러한 개념을 맥락화하고 덜 추상적으로 만드는 좋은 방법임.
수학에 대한 한마디
- 이 글에서는 수학이 많이 등장하지만, 수학을 어려워하지 말기를 권장함.
- 수학 표기법이 복잡해 보일 수 있지만, 대부분은 간단한 산술임.
- 수학을 두려워하지 말고 도전해보기를 권장함.
시작하기 전에
강체
- 강체 물리학은 변형되지 않는 물체를 다루는 물리 시뮬레이션임.
- 실제로는 모든 물체가 분자 수준에서 변형되지만, 시뮬레이션에서는 이를 단순화하여 강체로 다룸.
충돌 감지와 충돌 해결
- 충돌 감지는 장면에서 어떤 물체들이 충돌하는지 확인하는 과정임.
- 충돌 해결은 충돌한 물체들이 어떻게 움직여야 하는지를 결정하는 과정임.
- 이 블로그 시리즈에서는 충돌 해결 단계에 집중할 예정임.
우리가 하려는 일은?
- 대부분의 게임은 큰 루프 안에서 실행됨.
- 각 게임 루프 반복마다 물체의 위치가 현재 속도에 따라 업데이트됨.
- 속도는 크기와 방향을 가진 벡터임.
속도
- 속도는 일정 시간 동안 물체의 위치 변화를 나타냄.
- 물체의 새로운 위치는 현재 속도와 시간 간격을 곱한 변위를 더하여 계산됨.
충돌 해결
- 충돌 해결의 목표는 충돌 후 물체의 속도를 변경하여 물체들이 더 이상 서로 관통하지 않도록 하는 것임.
- 충돌 후 속도는 충돌 전 속도와 충돌로 인한 속도 변화의 합으로 표현됨.
충돌이란 무엇인가?
- 두 물체가 충돌 중인지 확인하려면 두 가지 조건이 충족되어야 함:
- 물체의 기하학적 형태가 접촉하거나 겹쳐야 함.
- 물체가 여전히 충돌을 향해 움직이고 있어야 함.
표면 법선
- 물체를 표면에서 최대한 멀리 이동시키려면 표면에 수직인 방향으로 이동해야 함.
- 이 방향을 법선 방향이라고 하며, 표면에 수직인 방향임.
내적
- 두 벡터가 같은 방향을 가리키는 정도를 계산하려면 내적을 사용함.
- 내적은 두 벡터의 대응 요소의 곱의 합으로 정의됨.
- 내적의 부호를 통해 두 벡터가 같은 방향인지 반대 방향인지 알 수 있음.
결론
- 충돌은 한 물체의 점이 다른 물체의 점과 접촉하고 상대 법선 속도가 음수일 때 발생함.
- 다음 글에서는 충돌의 실제 물리학에 대해 다룰 예정임.
GN⁺의 의견
- 물리 시뮬레이션의 중요성: 게임 개발에서 물리 시뮬레이션은 현실감을 높이는 중요한 요소임.
- 수학의 역할: 수학은 물리 시뮬레이션의 핵심이며, 이를 이해하면 더 나은 시뮬레이션을 만들 수 있음.
- 충돌 해결의 복잡성: 충돌 해결은 단순히 물체의 위치를 업데이트하는 것 이상으로 복잡한 과정임.
- 교육적 가치: 이 글은 물리 시뮬레이션의 기초를 이해하는 데 큰 도움이 됨.
- 추가 학습: 물리 엔진을 직접 구현해보는 것도 좋은 학습 방법임. Box2D나 Chipmunk 같은 오픈소스 물리 엔진을 참고할 수 있음.
Hacker News 의견
해커뉴스 댓글 모음 요약
-
Hey everyone, author here!
- 블로그 시리즈의 첫 번째 글로, 게임 개발자가 아니거나 수학 배경이 약한 사람들을 대상으로 함.
- 개념을 자세히 설명하는 이유는 이 때문임.
- 질문이 있으면 언제든지 환영함.
-
Oh! Look, a well-researched, deeply-explained, and interactive post.
- 도메인 이름과 TLD가 ".ski"인 것을 보고 다른 멋진 글을 쓴 저자일 줄 알았으나, 다른 사람이었음.
- 글의 품질이 비슷하게 훌륭함.
- ".ski" TLD의 비밀이 궁금함.
-
One side project I am working on right now is a 2d space shooter I am developing with my son.
- 아들과 함께 2D 우주 슈팅 게임을 개발 중임.
- 게임 엔진을 사용하지 않고 직접 구현해보려 했으나, 충돌 감지 문제에서 어려움을 겪음.
- 결국 Box2D를 사용하기로 결정함.
- 20년 이상의 개발 경험과 수학 배경이 있음에도 문제를 과소평가했음을 깨달음.
-
I always enjoyed the explanation from the N game: N game tutorial
- 플래시가 유행하던 시절, N 게임의 설명을 즐겼음.
-
I had fun building a TypeScript demo about this topic, involving balls that can bounce and collide. I learned a lot.
-
This is great. This reminds me of Chris Hecker's Rigid Body Dynamics series from GDMag/Gamasutra that I read (checks watch) almost 30 years ago!
- Chris Hecker의 강체 역학 시리즈를 떠올리게 함.
- Chris Hecker의 강체 역학
-
Collisions are violations of the pairwise non-intersection constraint between bodies.
- 충돌은 물체 간의 쌍방 비교차 제약 조건의 위반임.
- 충돌력은 이러한 제약 조건의 라그랑주 승수임.
- 충돌 노멀은 제약 함수의 부분 도함수임.
-
If you want to go further and go for rigid body dynamics and constraint, I found that series of blog post very useful: Toptal blog post
- 강체 역학과 제약 조건에 대해 더 알고 싶다면, 이 블로그 시리즈가 유용함.
-
To dredge up a related oldie-but-goodie memory of blog posts: Gaffer on Games
- 관련된 오래된 블로그 글을 떠올리게 함.
- Gaffer on Games
-
Guess this is a Shameless plug but I wrote an interesting program over 12 years ago using even then very old three Js which is not quite the metal but much less abstract than today's tools.
- 12년 전에 작성한 프로그램을 소개함.
- Busy Boxes