상세 컨텐츠

본문 제목

FT_Newton: 『게임 물리 엔진 개발』 vs Box2D - (4)

Computer Graphics/FT_Newton

by Banjosh 2025. 1. 15. 16:02

본문

Narrow Phase와 Solve 단계를 설계하면서 『게임 물리 엔진 개발』 책과 Box2D 코드를 함께 참고해보았다. 사실 물리 엔진은 정해진 구현 방식이 따로 있는 것이 아니기에, 두 자료에서 제시하는 구현 방법이 다를 수밖에 없었고, 그중 하나를 골라 적용해야 했다. 먼저 각 방법의 특징을 요약해보자.


1. 『게임 물리 엔진 개발』

이 책에서는 대략 아래와 같은 흐름으로 충돌을 처리한다.

  1. Broad Phase에서 추려진 충돌 쌍을 Narrow Phase에서 실제 충돌인지 판별
  2. 실제 충돌로 확인되면 해당 충돌에 우선순위 점수를 설정
  3. 모든 충돌을 우선순위 큐에 삽입
  4. 우선순위가 높은 충돌부터 순서대로 처리
  5. 충돌 처리 후 오브젝트가 움직이면서 새롭게 발생한 충돌들은 다시 우선순위 큐에 삽입
  6. 이 과정을 정해진 횟수(예: limit)만큼 반복한 뒤 다음 프레임으로 이동
  7. 우선순위 큐에 남아 있는 충돌들은 그대로 유지되어, 필요하면 다음 프레임에서 처리 됨

2. Box2D

Box2D에서는 다음과 같은 방식으로 충돌을 처리한다.

  1. Broad Phase에서 추려진 충돌 쌍을 Narrow Phase에서 실제 충돌인지 판별
  2. 실제 충돌로 확인되면 해당 충돌 정보를 연결 리스트에 저장
  3. DFS를 사용해 충돌 관계로 이어진 오브젝트와 충돌들을 Island 단위로 그룹화
  4. Island 단위로 충돌 처리를 수행

Island의 오브젝트간 충돌 처리를 여러 번 반복 적용해 점진적으로 충돌 해소

 


 처음엔 『게임 물리 엔진 개발』 책을 먼저 읽어서 그런지 무조건 이 방법으로 구현을 하려고 했다. 하지만 책의 내용이 개념 위주로 설명되어있어 구현에 대한 자세한 내용이 없어 아쉬웠고, 특히 우선순위 큐에 쌓여가는 충돌들을 어떻게 처리를 해야할지 감이 잡히지 않았다. 고민을 하다가 찾은 것이 Box2D 코드였고 여기서는 Island라는 개념을 통해 좀 더 직관적으로 충돌을 처리하고 있었다. 무작정 구현을 하기 보다는 내가 이해할 수 있는 방법을 고르자는 생각에 Box2D 방법을 선택하였고, 그 결과 Box2D의 코드를 열심히 분석해 Island 단위의 충돌 처리를 우리의 물리 엔진에 맞게 구현하게 되었다.

 

이 다음엔 Narrow Phase를 어떻게 처리했는지에 대해 알아보는 글을 쓸 예정이다.

관련글 더보기