Skip to content

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 님께도 감사드립니다.

여담

물리엔진을 본격적으로 공부하려는 사람이

많지는 않을 것입니다.

게임 엔진 개발 자체도 마이너한 분야인데,

그래픽스도 아니고 물리 쪽은 더욱 마이너하죠.

제가 느끼기에 물리엔진을 공부해 보려고 할 때면

  1. 적절한 공부 자료가 없다. (특히 한국어로 된)
  2. 만약 있다고 해도 매우 부실하거나 뭐 하나씩 빠져있다.
  3. 방대한 상용 엔진 뜯어보기에는 너무 귀찮다.

이런 문제 때문에 오랫동안 미뤄 왔습니다.

(3번은 완벽히 제 문제입니다)

그렇지만 개발 블로그 쓰게 된 참에

이론들을 하나씩 공부하고 기록해 보면

저도 좋고 다른 사람에게도 도움이 되지 않을까

싶어서 쓰게 되었습니다.