Box3D - 오픈소스 3D 물리 엔진 공개
(box2d.org)- 게임 서버에서 대규모 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의 물리 엔진 교체에서는 몇 가지 지름길을 활용할 수 있었음
- Blueprint가 아닌 자체 스크립팅 시스템을 사용함
- Esoterica animation system을 Unreal로 포팅해 사용함
- Box3D에 직접 연결되는 커스텀 ECS를 사용함
- 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를 시작하려면 기본 git과 CMake를 설치한 뒤 Box3D repository를 클론하면 됨
- 빌드 방법은 README에 있음
- 빌드 후 샘플을 실행해 기능을 확인하고, 샘플 코드로 코딩을 시작할 수 있음
- 엔진 헤더에는 전체 Doxygen 주석이 있으며, 작성된 매뉴얼은 진행 중임
- 호스팅된 documentation이 제공됨
- 최소 예제 코드는 HelloWorld test에서 볼 수 있음
현재 사용처와 앞으로의 계획
- Box3D는 The Legend of California 외에도 여러 곳에서 이미 사용 중임
- s&box: Facepunch Studios의 게임 플랫폼
- Esoterica: Bobby Anguelov가 이끄는 오픈소스 게임 엔진
- A 1000-player space game: Glenn Fiedler의 멀티플레이어 게임
- 여러 게임에서 사용 중이지만 Box3D는 아직 알파 소프트웨어로 간주됨
- 곧 v0.1 태그를 만들고 v1.0 릴리스까지 발전시킬 계획임
- 더 많은 테스트와 완성도 높은 문서가 필요하지만, 기능 세트는 이미 좋은 위치에 있음
- 검토 중인 작업은 다음과 같음
- 캐릭터 이동 기능 강화
- ghost collision 완화 개선
- 최적화
- joint solver 개선
- Box2D와 함께 Box3D도 무기한 지원할 것으로 예상함
- 성숙 단계에 도달하면 기능 작업에서 잠시 쉴 수 있음
- Box2D와 달리 Box3D는 pull request를 받을 것으로 예상하며, CLA를 사용할 가능성이 있음
- Box3D용 별도 웹사이트나 Discord 서버는 만들지 않음
- 업데이트는 Box2D 사이트에서 제공됨
- 대화는 Box2D Discord server에서 진행함
- Box3D가 The Legend of California에서 동작하는 모습을 보려면 home page와 Steam을 통해 팔로우할 수 있음
댓글과 토론
Lobste.rs 의견들
-
왜 여기에 vibecoding 태그가 붙었는지 모르겠음
- 정말 이해가 안 됨. 이게 vibecoding으로 태그된다면 이제 vibecoding 태그가 무슨 뜻인지 모르겠음
이 프로젝트가 vibe coding으로 만들어졌다고 볼 이유가 없고, 글에서도 vibecoding을 다루지 않음. 글, 블로그, 커밋 이력 어디에도 그런 흔적이 보이지 않음
근거가 궁금하지만, 이유 없이 이런 식으로 딱지를 붙이는 건 꽤 무례하게 느껴짐 - 아마 이 섹션 때문일 수 있음
https://github.com/erincatto/box3d#llm-usage
그래도 이 태그는 불필요해 보임 - 모더레이션 로그를 보면 사용자 제안 때문에 붙었다고 되어 있음
- Lobsters에서 그 태그는 이제 아무 의미도 없음. LLM 언급만 있으면 거의 다 붙는 수준이라 그냥 없애도 될 듯함
- 정말 이해가 안 됨. 이게 vibecoding으로 태그된다면 이제 vibecoding 태그가 무슨 뜻인지 모르겠음
-
정말 멋짐! 저 삼각형들을 저장하는 데 어떤 자료구조를 골랐고, 하드웨어를 어떻게 활용해서 삼각형들을 병렬로 그리는지 궁금함
Hacker News 의견들
-
Box2D가 언급될 때마다, 같은 저자인 Box3D의 라이브러리라는 당연한 연결과 함께 예전 이야기가 떠오름
https://kotaku.com/this-guy-created-angry-birds-physics-and-...- Rovio(Angry Birds 제작사)에서 일할 때 들은 이야기인데, 마케팅 책임자 Peter Vesterbacka가 강연 중 질문을 받다가 한 청중이 게임에 어떤 물리 엔진을 쓰는지 물었고, Vesterbacka가 Box2D라고 정확히 답하자 그 사람이 “왜 크레딧에 없나요? 참고로 저는 Box2D 제작자 Erin Catto입니다”라고 했다고 함
Vesterbacka는 “행사 끝나고 저에게 오세요”라고 답했고, 아마 그때 Erin이 후디를 받았을지도 모름. 이후 곧 크레딧에 이름이 추가됐다고 함
다들 놀랐던 건 마케팅 담당자가 어떤 물리 엔진을 쓰는지 알고 있었다는 점이었음
- Rovio(Angry Birds 제작사)에서 일할 때 들은 이야기인데, 마케팅 책임자 Peter Vesterbacka가 강연 중 질문을 받다가 한 청중이 게임에 어떤 물리 엔진을 쓰는지 물었고, Vesterbacka가 Box2D라고 정확히 답하자 그 사람이 “왜 크레딧에 없나요? 참고로 저는 Box2D 제작자 Erin Catto입니다”라고 했다고 함
-
Box2D는 한때 물리 기반 인디 게임들의 기반이었음
지금 환경이 충분히 비어 있어서 다시 부흥할 여지가 있는지 궁금함- 애초에 무료 오픈소스 3D 물리 엔진이 많지 않았음. 오래된 선조 격으로는 ODE, Bullet, Newton Dynamics가 있고 모두 2000년대 초반에 처음 나왔으며, 그 뒤 거의 20년 동안 비어 있다가 2021년에 Jolt, 이제 Box3D가 나온 흐름으로 보임
이렇게 작고 폐쇄적인 목록에 새 항목이 추가되는 건 언제나 환영할 일임 - Incredibots에 빠져 있던 시절이 기억남. 그때 처음 Box2D를 알게 됐음
- Box2D는 여전히 꽤 훌륭함. 2D 물리 게임 프로젝트에는 확실히 추천할 만함
Box2D와 이제 Box3D의 C API는 작업하기 정말 좋음 - 예전에 Chipmunk2D를 조금 써봤는데, 내가 하던 난해한 작업에는 더 쓰기 쉬웠음
- 애초에 무료 오픈소스 3D 물리 엔진이 많지 않았음. 오래된 선조 격으로는 ODE, Bullet, Newton Dynamics가 있고 모두 2000년대 초반에 처음 나왔으며, 그 뒤 거의 20년 동안 비어 있다가 2021년에 Jolt, 이제 Box3D가 나온 흐름으로 보임
-
이건 정말 반가움. Erin Catto는 멋진 해커이고, 오픈소스 커뮤니티에 코드를 공유해줘서 고마움
발표에는 결정성(determinism) 이야기가 없었지만, 그 부분도 더 보고 싶음. Unity 내장 물리로 네트워크 당구 게임을 만들려고 하면, 클라이언트들이 무슨 일이 일어났는지 서로 맞추지 못해서 꽤 골치 아픔- 같은 걸 찾고 있었음. 리플레이 메커니즘이 있으니 결정적인 것처럼 보이긴 함. 다만 부동소수점 물리라면 플랫폼 간에는 아닐 수 있음
문서에 따르면-ffast-math는 지원하지 않는다고 하니, 어쩌면 플랫폼 간 결정성을 의도한 것일 수도 있음: https://box2d.org/documentation3d/recording.html
수정:ffast-math에 대한 의미를 명확히 함
- 같은 걸 찾고 있었음. 리플레이 메커니즘이 있으니 결정적인 것처럼 보이긴 함. 다만 부동소수점 물리라면 플랫폼 간에는 아닐 수 있음
-
머신러닝 연구자로서 Box2D는 강화학습 환경 덕분에 익숙함. OpenAI Gym에서 Lunar Lander나 Car Racing 같은 표준 벤치마크 환경을 떠받치는 기반임
https://gymnasium.farama.org/environments/box2d/car_racing/ -
물리 시뮬레이션은 위험한 토끼굴임. 강체와 물리적으로 그럴듯한 동작에만 집중해도 충돌 감지와 충돌 해결에는 열린 문제가 많음
기하에는 볼록 근사나 분해를 쓰고, 해법기는 손으로 튜닝하는 게 일반적이며, 견고성과 정밀도를 속도와 계속 맞바꿔야 함 -
이걸 정말 기다리고 있었음. 예전에 Box2D로 꽤 성공한 적이 있고, F/OSS 중에서도 확실히 최상위권에 드는 결과물임
Box3D 기반 Spectre VR? 이건 꼭 나올 것 같음. Tanarus의 느낌도 있음
수정: Legend of California 데모(Unreal Engine 기반)에서 녹화와 재생으로 전환되는 부분은 꽤 급격한 도약처럼 보임. 처음엔 좀 기본적으로 느껴져도 데모 영상의 최소 18분 지점까지는 꼭 봐야 함. 꽤 거칠게 흥미로워지고, 녹화와 재생 기능이 멋짐- Tanarus를 항상 떠올리는데, 언급하는 사람은 거의 못 봄
-
Rapier, 그 전에는 Cannon과 Ammo를 조금 알고 있는데, Box3D와는 어떻게 비교되는지 궁금함
덧붙이면 몇 주 전에 직접 3D 공간의 물리 엔진을 만들었고 여기에도 공유했음. 사실 일정 간격으로 물체를 아래로 내리는 한 줄짜리지만, 이미 놀랄 만큼 잘 작동함. 학습 관점에서는 정말 재미있으니 한번 해보길 추천함 -
며칠 전부터 Jolt를 써서 브라우저용 Tron 스타일 3D 게임을 만들기 시작했는데, 마침 이걸 보니 재미있음. 지금까지 Jolt는 꽤 잘 작동하지만 이것도 꼭 살펴볼 생각임
1 - 이 도메인은 몇 년째 가지고 있었음: https://lightcycles.io- Jolt라면 https://github.com/jrouwe/JoltPhysics를 말하는 건가?
-
Jolt와 어떻게 비교될지 궁금함. 둘 다 이력이 좋아 보이는데, 한쪽은 Valve와 Erin Catto 쪽이고, 다른 한쪽은 Horizon 게임들에서 쓰였음
-
“Valve 쪽에서는 Rubikon이 계속 발전 중이고, Dirk가 Box3D와 비슷한 최적화를 새 엔진 Ragnarok에 개발했다. 향후 Valve 게임에서 보게 될 것이다.”
잠깐만…- 너무 기대하지 않는 게 좋음. 아마 Deadlock의 배구 게임 모드에 쓰일 것임
- Valve가 코드명 HLX인 게임을 만들고 있고, 물리 기능을 엄청 많이 쓴다고 알려져 있음. 다만 “HLX”가 무슨 뜻인지는 전혀 모르겠음
- Valve
Box3D
3D
3
희망! - Half-Life 2D 확정?
- Day of Defeat Source 2.1이 딱 일주일 남았음!