0. 소개
목차
- 물리엔진?
- 공부할 가치가 있는가?
- 알아야 할 사전지식
- 예제 구동용 라이브러리들
- 게시할 내용 정리
- 감사의 말
- 여담
물리엔진?
현실에서 일어나는 물체 간의 상호작용을 가상으로 시뮬레이션.
게임을 더 실감나게 해주는 기술들의 집합.
공부할 가치가 있는가?
만약 '게임 개발' 을 하고 싶다면, 이거 공부할 시간에 그래픽스를 공부하는 게 낫다고 생각합니다.
상용 엔진을 사용할 때, 물리 엔진은 제공하는 기능에 비해서 '직접 조작해봐야' 하는 부분이 적습니다.
간단한 플랫포머나 작은 FPS의 경우 그냥 대충 최적값 몇 개 세팅해 두면 (웬만해선)
심각한 성능 저하는 나지 않습니다.
그에 비해서 그래픽스는 클라이언트 프로그래머가 해야 할 게 꽤나 있습니다.
생각나는 것만 해도 인스턴싱, 배치 렌더링, 메시 컬링 최적화, 포스트 프로세싱... 뭐 그런 것들은
결코 옅은 그래픽스 지식만으로는 이해할 수 없고, 작은 게임이라고 하더라도
후처리같은걸 너무 많이 걸면 성능이 기하급수적으로 나빠집니다.
하지만, 물리 엔진 공부는 재미있습니다. 그래픽스 못지 않게 게임에서
화려하고 찰진 효과를 담당하는 영역이기에, 흥미가 있다면 꼭 깊게 파보시는 걸 추천합니다.
특히 그래픽스와 똑같이, 물리엔진을 만들어 보면 창조주의 기분을 간접적으로 체험할 수 있습니다.
알아야 할 사전 지식
표면적인 이론들은 고등학교 수학만으로도 이해할 수 있습니다.
그러나 벡터와 행렬의 기본(연산)은 알고 있어야 합니다.
당연하게도, 여러 이론이 나올 테지만 미적분학과 선형대수학을 기반으로
이해할 수 있게 쓸 겁니다.
예제 구동용 라이브러리들
여러 렌더링 라이브러리가 있지만,
물리엔진(의 개념들)을 시각화하기 위해서
C++와 Raylib v5.5 (+glm)을 사용합니다.
사실 창 띄워서 점과 선만 그릴 수 있다면
무슨 라이브러리던
직접 가져와서 통합하셔도 무방합니다.
게시할 내용 정리
일단 물리 엔진 프로그래밍은 크게 2D / 3D 로 나뉘는데,
3D로 들어가면 갑자기 알아야 할 것들이 많아집니다.
그렇기에 2D를 먼저 다 보시고 3D쪽을 봐주세요.
또, 2D / 3D 와는 별개로 '기하학' 파트와 '역기구학', '유체역학' 파트도 작성할 예정입니다.
참고로 콤마로 모아둔 것들은 너무 길어지면 각기 다른 게시글로 분리될 수도 있습니다.
2D
- 2D 물리엔진의 구조 (월드, 바디, 선형 운동과 각운동, 제약(Constraints)의 추상화)
- 충돌 감지 with SAT, GJK & EPA
- 제약 풀기 (PGS로 vel 풀고 Separate pos solver 설명, friction, restitution, betta / gamma)
- 최적화 - 파티셔닝 (QuadTree, Dynamic AABB Tree, SAP, 공간해시)
- 최적화 - Projected Gauss-Seidel Solver + Separate Position Solver
- 최적화 - Position Correction
- 최적화 - Accumulated Impulse
- 최적화 - Warm Starting
- 최적화 - Continuous Collision Detection (a.k.a CCD), Time Of Impact & SubStepping
- 최적화 - Sleeping
- 최적화 - Islanding
- Body Composition
- Collision Filtering
- Round Polygon + Capsule Support
- 조인트 - FixedDistance / MaxDistance
- 조인트 - 도르래
- 소프트 바디 - 훅의 법칙, 압력 적용, 충돌감지, Self Collision, Shape Matching
- Position Based Dynamics (a.k.a PBD)
- 여러가지 Solver 소개 (erinCatto::solver2D참고, PGS, PGS_Soft, Sticky, XPBD ++ ABVD?)
3D
- 26년 2월 27일 기준, 확실히 정해놓진 않았습니다..
- // 사원수(Quaternion)와 회전 행렬
- // 관성 텐서
기하학
- 2D - IntersectPoints, Contains, ClosestPoint, BoundingBox, BoundingCircle
- 2D - 레이 캐스팅: get_point, get_normal
- 2D - 폴리곤 연산: Union, Subtraction, Intersection, ExclusiveOR
- 2D - 컨벡스 헐, 삼각분할, Voronoi Diagram
- // 3D - 26년 2월 27일 기준, 3D 기하, 특히 계산기하학 부분은 너무 방대해서 정리하기 귀찮다.
- // 3D - CGAL 소개
역기구학
- Forward Kinematic, Inverse Kinematics, 코사인법칙
- 로보틱스로 확장
- // TODO : Solver 정리하기...
유체역학
- SPH / Grid
- 그래픽스와 통합하기 - GLSL / CUDA
- // TODO : 마찬가지로 제대로 공부할 시간 필요.
감사의 말
2차원 물리엔진의 대명사인 Box2D를 작성하신
Erin Catto 님께 큰 감사드립니다.
멋진 2D 물리엔진 만들어주신 Sopiro 님께도 감사드립니다.
여담
물리엔진을 본격적으로 공부하려는 사람이
많지는 않을 것입니다.
게임 엔진 개발 자체도 마이너한 분야인데,
그래픽스도 아니고 물리 쪽은 더욱 마이너하죠.
제가 느끼기에 물리엔진을 공부해 보려고 할 때면
- 적절한 공부 자료가 없다. (특히 한국어로 된)
- 만약 있다고 해도 매우 부실하거나 뭐 하나씩 빠져있다.
- 방대한 상용 엔진 뜯어보기에는 너무 귀찮다.
이런 문제 때문에 오랫동안 미뤄 왔습니다.
(3번은 완벽히 제 문제입니다)
그렇지만 개발 블로그 쓰게 된 참에
이론들을 하나씩 공부하고 기록해 보면
저도 좋고 다른 사람에게도 도움이 되지 않을까
싶어서 쓰게 되었습니다.