소프트웨어 게임 개발 마지막 수정: 2026-07-07 13:58:22

Bullet Physics
종류실시간 물리 엔진 (오픈소스)
개발Erwin Coumans 외 커뮤니티
언어C++ (Python 바인딩 PyBullet)
라이선스zlib (자유 라이선스)
최초 공개2000년대 중반
분야게임·영화 VFX·로보틱스·강화학습
플랫폼크로스 플랫폼

1. 개요[편집]

공짜인데 영화에도 쓰이고 로봇도 배운다. 심지어 소스도 준다.

Bullet(Bullet Physics Library)은 강체·연체·차량 동역학을 실시간으로 계산하는 오픈소스 물리 엔진이다. 게임에서 출발했지만 영화 시각효과, 로보틱스 시뮬레이션, 강화학습 환경까지 영역을 넓힌 보기 드문 전천후 엔진으로, zlib 라이선스라 상업적 이용에 사실상 아무 제약이 없다. 물리 엔진이 필요한데 예산은 없고 소스는 봐야겠다면 십중팔구 후보에 오르는 이름이다.

이름이 “총알”인 이유는 딱히 없다.1 다만 빠른 물리 계산을 지향한다는 점에서 나쁘지 않은 작명이긴 하다.

2. 역사와 개발자[편집]

Bullet은 에르빈 쿠만스(Erwin Coumans)가 주도해 개발했다. 그는 소니 컴퓨터 엔터테인먼트, AMD를 거쳐 구글의 로보틱스·강화학습 연구팀에 몸담았는데, 이 이력이 Bullet의 진화 방향을 그대로 설명한다. 초기에는 게임과 실시간 그래픽스를 겨냥했지만, 개발자가 로보틱스·머신러닝 세계로 옮겨가면서 엔진도 물리 정확도와 재현성을 중시하는 방향으로 무게추가 옮겨갔다.

이 과정에서 태어난 것이 PyBullet이다.2 엔진에 파이썬 바인딩을 씌워 강화학습 실험 환경으로 손쉽게 쓰게 만든 것으로, “로봇 팔이 물건을 집는 법을 스스로 배우는” 논문 실험의 상당수가 이 위에서 돌아갔다. 게임 엔진으로 시작해 AI 연구 인프라가 된 셈이다.

이후 개발 흐름은 차세대 엔진인 Bullet 3 / GPU 파이프라인으로 이어졌으나, 실전에서 가장 널리 검증된 것은 여전히 성숙한 2.x 계열의 강체 솔버다.

3. 강체 동역학[편집]

Bullet의 뼈대는 강체 동역학이다. 각 물체는 질량과 관성 텐서를 가진 강체로 표현되고, 매 스텝마다 힘과 토크를 적분해 위치·자세를 갱신한다. 적분은 베를레 적분 계열의 반음적(semi-implicit) 오일러 방식이 기본인데, 게임 물리에서는 소수점 다섯 자리의 정확도보다 60fps에서 폭발하지 않는 안정성이 훨씬 중요하기 때문이다.

시뮬레이션 루프는 대체로 이런 흐름을 반복한다.

  • 넓은 단계(broad phase)와 좁은 단계(narrow phase)로 충돌 감지를 수행해 접촉점을 찾는다.
  • 접촉·관절 조건을 제약 해결기에 넘겨 속도를 보정한다.
  • 시간 적분으로 물체를 전진시킨다.

게임 엔진 물리에서 가장 골치 아픈 것은 “물체가 서로를 뚫고 지나가는” 문제인데, Bullet은 CCD(연속 충돌 감지)로 빠르게 날아가는 작은 물체가 얇은 벽을 관통하는 사고를 막는다. 총알이 벽을 뚫어버리면 곤란하니, 이름값은 하는 셈이다.

4. 충돌 감지[편집]

충돌 감지는 물리 엔진 계산량의 큰 몫을 차지하며, Bullet은 이를 두 단계로 나눠 처리한다.

  • 넓은 단계 — AABB(축 정렬 경계 상자)를 이용해 “충돌할 가능성조차 없는” 쌍을 대량으로 쳐낸다. 물체 수가 nn일 때 모든 쌍을 검사하면 O(n2)O(n^2)이지만, 공간 분할 자료구조로 이를 크게 줄인다.
  • 좁은 단계 — 살아남은 후보 쌍에 대해 실제 형상끼리의 정밀 교차를 계산한다. 볼록(convex) 형상 간에는 GJK/EPA 알고리즘으로 최근접점과 침투 깊이를 구하는데, 이 두 알고리즘은 실시간 충돌 계산의 고전으로 꼽힌다.

복잡한 오목 형상은 여러 개의 볼록 조각으로 분해(convex decomposition)해 다루는 것이 관례다. 물리 엔진에서 “충돌용 모양은 렌더링용 모양보다 단순하게 만든다”는 것은 성능을 위한 오랜 지혜다.3

5. 제약과 관절[편집]

물체를 그냥 던져만 놓으면 게임도 로봇도 안 된다. 경첩(hinge), 볼-소켓, 슬라이더 같은 제약 해결기 조건을 걸어 물체들을 관절로 엮어야 비로소 문이 돌쩌귀에 매달리고 로봇 팔이 굽는다. Bullet은 이 조건들을 속도 수준에서 반복적으로 만족시키는 순차 임펄스(sequential impulse) 방식의 솔버를 쓴다.

여기에 천 시뮬레이션과 연체 동역학 모듈이 얹혀 있어, 깃발·망토·부드러운 젤리 같은 변형체를 다룰 수 있다. 천은 보통 질점을 스프링으로 엮은 질량-스프링 그물로 모델링되며, 여기에도 결국 제약 반복이 개입한다. 물리 엔진의 세계에서는 결국 모든 것이 “제약을 얼마나 빠르고 안정적으로 만족시키느냐”의 문제로 수렴한다.

6. 활용과 위상[편집]

Bullet의 진짜 강점은 폭넓은 채택 이력이다. 여러 상용 게임과 게임 엔진의 물리 백엔드로 쓰였고, 오픈소스라는 이유로 학계와 로보틱스 연구에서 표준에 가까운 위치를 차지했다. 특히 PyBullet은 강화학습 벤치마크 환경의 사실상 기본값 중 하나로 자리 잡아, 파티클 시스템이나 유체 같은 화려한 효과보다는 “재현 가능한 강체·관절 물리”라는 견실한 영역에서 신뢰를 쌓았다.

경쟁 구도에서는 PhysX와 자주 비교된다. PhysX가 NVIDIA GPU 가속과 상용 게임 엔진 통합으로 대규모 실시간 효과에 강하다면, Bullet은 완전 오픈소스·크로스 플랫폼·연구 친화성으로 차별화된다. “GPU로 화려하게 부수고 싶다”면 PhysX, “소스를 뜯어보며 물리를 재현하고 싶다”면 Bullet이라는 것이 대략적인 갈림길이다. 물리 엔진의 결과가 실제 세계와 맞는지 따지는 검증 및 확인 관점에서는, 소스 공개라는 성질이 Bullet에 확실한 이점을 준다.

7. 관련 문서[편집]

8. Footnotes[편집]

  1. 물리 엔진 이름 짓기는 원래 이런 식이다. 옆 동네에는 아예 “구슬픈 총알(Havok)” 같은 이름도 있다.

  2. 게임 엔진으로 태어나 강화학습 논문의 실험대가 된 셈인데, 덕분에 “물리적으로 그럴듯함”보다 “매번 똑같이 재현됨”이 더 중요한 세계로 이사하게 되었다. 로봇은 재현되지 않는 물리를 학습할 수 없다.

  3. 캐릭터의 정교한 모델을 그대로 충돌 형상으로 쓰면, 물리 엔진은 삼각형 수만 개를 매 프레임 검사하다 장렬히 프레임 드랍으로 산화한다.