Box3D - 오픈소스 3D 물리 엔진 공개
4 hours ago
1
- 게임 서버에서 대규모 3D 물리 시뮬레이션을 직접 제어해야 하는 요구가 커지면서, Box3D가 Box2D 계열의 오픈소스 3D 물리 엔진으로 공개됨
- 구조는 Box2D와 가깝고 C API, C17 소스, 서브스테핑 솔버, 연속 충돌, 그래프 컬러링, wide SIMD 접촉 솔버, 멀티스레딩 훅을 포함함
- Unreal Engine의 Chaos에서 자이로스코픽 토크, 나무 낙하, 대규모 broad-phase 요구를 만족하기 어려웠던 경험이 개발의 직접 배경이 됨
- 삼각형 메시·높이 필드·baked compound collision, double 기반 대형 월드, 크로스플랫폼 결정성, 기록/재생이 3D 게임용 기능으로 들어감
- 여러 게임·엔진에서 이미 쓰이고 있지만 아직 알파 소프트웨어이며, v0.1 태그 이후 v1.0까지 테스트와 문서 보강이 필요함
Box3D의 성격과 핵심 기능
- Box3D는 GitHub에 공개된 오픈소스 3D 물리 엔진이며, Box2D의 설계를 3D 게임 요구에 맞게 확장한 프로젝트에 가까움
- 핵심 아키텍처는 Box2D와 거의 동일하고, 라이브러리 전체 소스는 C17로 작성됨
- 주요 엔진 기능은 다음과 같음
-
C API
- 서브스테핑 솔버
- 연속 충돌
- 대형 섬용 그래프 컬러링
- wide SIMD 접촉 솔버
- 멀티스레딩 훅
- 선택적 내부 스케줄러
- 위치에 double을 쓰는 대형 월드 지원
- 크로스플랫폼 결정성
- 기록과 재생
- 3D 게임을 위해 추가된 충돌 기능도 포함됨
- 삼각형 메시 충돌
- 높이 필드 충돌
- baked compound collision
The Legend of California에서 생긴 필요
- Box3D의 첫 개발 동기는 Kintsugiyama에서 개발 중인 The Legend of California였음
- 이 게임은 Unreal Engine으로 제작되며, 프로젝트는 Unreal 5.0에서 시작함
- Unreal의 기본 물리 엔진인 Chaos 실험에서 여러 한계가 드러남
- 자이로스코픽 토크 시뮬레이션을 지원하지 않아, 가느다란 물체가 각속도를 보존하며 오래 회전하는 동작을 처리하기 어려웠음
- 개발자는 2015년 GDC에서 물리 엔진에 자이로스코픽 토크를 추가하는 약 10줄짜리 드롭인 알고리듬을 발표한 적이 있음
- Epic은 이 기능을 2024년 말 Unreal Engine에 추가함
- 더 큰 문제는 생존 게임의 핵심 기능인 나무 베기에서 발생함
- 쓰러지는 나무가 불규칙하게 움직이고 화면에서 순간이동함
- 상황은 큰 캡슐이 매끄러운 삼각형 메시 위로 떨어지는 시뮬레이션이었고, 쉽게 처리돼야 하는 사례였음
- 서버에 수십만 엔티티가 존재하므로 빠른 broad-phase도 필요했음
- 이 요소가 게임의 중심이어서 미들웨어에 맡기기에는 위험하다고 판단함
- 개발자는 broad-phase 자료구조 경험이 많고 관련 GDC 발표도 진행한 적이 있음
Rubikon-Lite에서 Box3D로
- 기존 오픈소스 물리 엔진인 Jolt 사용도 검토했지만, Dirk Gregorius가 Rubikon-Lite를 포크해 필요에 맞게 수정하는 방식을 제안함
- Dirk Gregorius는 Half-Life: Alyx에 들어간 커스텀 물리 엔진 Rubikon을 만든 물리 프로그래머이며, 취미·홈 버전의 Rubikon을 유지하고 있음
- Rubikon-Lite를 Unreal에 직접 연결하자 자이로스코픽 토크가 동작했고, 나무도 정상적으로 쓰러짐
- Unreal의 물리 엔진 교체에서는 몇 가지 지름길을 활용할 수 있었음
- Box2D v3.0의 최적화를 Rubikon-Lite 포크에 가져오려다 보니, 2D와 3D 작업을 가능한 한 비슷하게 유지할 필요가 생김
- Rubikon-Lite의 거의 모든 API, 자료구조, 알고리듬을 Box2D 코드로 교체함
- 2D와 3D의 자료구조는 상당 부분 공간 차원에 무관했음
- 시간이 지나며 Rubikon-Lite 포크는 Box3D로 바뀜
- 현재 Box3D에는 convex hull 생성과 일부 충돌 알고리듬에 Rubikon-Lite 코드가 남아 있음
- 나머지는 Box2D 코드와 Box3D용 신규 코드임
- Valve 쪽에서는 Rubikon이 계속 발전 중이며, Dirk는 Box3D와 유사한 최적화를 새 엔진 Ragnarok에 개발함
커스텀 물리 엔진으로 맞춘 게임 요구
- The Legend of California는 큰 오픈월드와 서버 권한 구조를 가진 프로젝트임
- 쓰러지는 나무, 래그돌, 복셀, 살룬 문, 회전초가 모두 서버에서 시뮬레이션됨
- 커스텀 물리 엔진을 쓰면 게임 요구에 맞춰 기능과 성능을 직접 조정할 수 있음
- 성능 작업은 특히 쓰러지는 나무에 많이 들어감
- 거대한 redwood 나무가 복셀 지형 위로 빠르게 떨어짐
- 메시 충돌과 CCD를 안정적으로 동작시키는 작업이 큼
- 복셀 시스템용 충돌 메시도 런타임에 빠르게 만들어야 함
- 복셀은 격자형이어서 median split으로 잘 구성됨
- 스트리밍도 중요한 요구였음
- stronghold는 kitbashing으로 구성됨
- 큰 stronghold에는 별도 충돌 메시가 약 50,000개 있을 수 있음
- 이를 물리 엔진에 하나씩 로드하면 비효율적이고 메모리를 많이 씀
- 별도 충돌 형상을 최적화된 자료구조로 조리해 단일 uber shape으로 로드하는 compound collision system을 만들었음
- 이 방식은 수천 개 body와 shape을 만드는 오버헤드를 제거함
오픈소스화한 이유와 사용 대상
- 개발자는 2004년부터 게임용 물리 엔진을 만들어왔고, 직장을 옮길 때마다 그 작업을 두고 와야 했음
- Box2D는 지식과 노력을 오픈소스 프로젝트로 축적해 이후 작업의 기반으로 쓰기 위해 만들어진 측면이 있음
- 3D 쪽에서는 비슷한 작업을 계속 다시 만드는 부담이 있었음
- Kintsugiyama는 Box3D를 오픈소스로 공개하고 업무의 일부로 작업할 수 있도록 허용함
- Box3D는 다른 물리 엔진과 경쟁하려는 프로젝트가 아니며, Box2D의 설계가 마음에 드는 사용자라면 Box3D도 잘 맞을 가능성이 큼
시작 방법과 문서
현재 사용처와 앞으로의 계획
- Box3D는 The Legend of California 외에도 여러 곳에서 이미 사용 중임
- 여러 게임에서 사용 중이지만 Box3D는 아직 알파 소프트웨어로 간주됨
- 곧 v0.1 태그를 만들고 v1.0 릴리스까지 발전시킬 계획임
- 더 많은 테스트와 완성도 높은 문서가 필요하지만, 기능 세트는 이미 좋은 위치에 있음
- 검토 중인 작업은 다음과 같음
- 캐릭터 이동 기능 강화
- ghost collision 완화 개선
- 최적화
- joint solver 개선
- Box2D와 함께 Box3D도 무기한 지원할 것으로 예상함
- 성숙 단계에 도달하면 기능 작업에서 잠시 쉴 수 있음
- Box2D와 달리 Box3D는 pull request를 받을 것으로 예상하며, CLA를 사용할 가능성이 있음
- Box3D용 별도 웹사이트나 Discord 서버는 만들지 않음
- Box3D가 The Legend of California에서 동작하는 모습을 보려면 home page와 Steam을 통해 팔로우할 수 있음
-
Homepage
-
Tech blog
- Box3D - 오픈소스 3D 물리 엔진 공개