Post Lists

2018년 8월 19일 일요일

물리 엔진 구현 로드맵

자료 하나를 통해서 어떻게 구현해 나가야 할지를 조금 알았다.

거기서 정리한 TO-DO list는

  • 기본 벡터 수학 함수를 배우고 그것들을 구현해라 : 덧셈, 곱셈, 내적, 외적, 회전, 길이는 모두 계산하기에 유용하다.
  • 너가 할 수 있는 가능한 많은 다른 힘들에 대해 배워라 : 무게 (즉, gravity on Earth), spring force, viscous damping, air drag, static and dynamic friction, and gravitation (즉, 공간에서 중력)
  • numerical integration tehniques을 배워라 : Euler's method (개념적 이해를 위해), velocity verlet (대부분의 심플 게임/kinematics), midpoint method (대부분의 간단한 프로그램들/일반 힘들), Runge-Kutta methods (고급의 그리고 정확한 시뮬레이션을 위한).
  • rigid body에 적용될 때, 힘이 어떻게 torques가 되는지에 대해 이해를 증진시켜라. 이것은 checkpoint #2에서의 spring force와 함께 보여지지만, 너는 어떻게 힘이 torques가 되는지와, 회전할 때 오브젝트가 어떻게 행동하는지에 대한 이해를 개발하는데 목표를 두어야 한다.
  • separating axims theorem을 배우고, 그것에 대해 철저한 직관적 이해를 개발해라. 이것은 collision detection에 대해서도 중요할 뿐만 아니라 벡터 수학을 학습하는 것을 강화하는데 도움이 된다. 이 기법은 그것의 구현에 있어서 몇 가지 벡터 개념을 사용하기 때문이다.
  • 기본 AABB test로 separating axis theorem을 어떻게 간단하게 하는지 배워라. 너는 이것을 너의 collision detection algorithm의 값 싼 first-pass로서 사용할 수 있다.
  • 너의 collision detection algorithms에서 좀 더 효과적인 first-pass로서 quadtrees에 대해 조사해라. 또한 quadtrees와 simple fixed grid를 사용하는 것 사이의 차이에 대해 생각해라. 너의 프로그램에 더 잘 어울리는 어떤 것이든 선택해라; 너의 오브젝트들은 게임 월드 도처에 고르게 분산되어있는가? 아니면 그것들은 함꼐 뭉쳐있는가?
  • continuous (discrete와 반대인) collision detection algorithms을 배워라. 너는 여전히 separating axis theorem 또는 AABB tests를 사용할 수 있지만, 너가 오브젝트를 테스트 하는 방식은 조금 다르다.
  • 좀 더 정교한 collision response techniques을 배워라. force-based methods와 impulse-based methods가 있다. 너가 선택하는 route는 너가 어떻게 오브젝트를 모델링 할지와 너의 collision detection algorithm이 무슨 정보를 반환할지 달려있다. collision normals, angle of reflection and momentum에 대해 배워라.
  • GJK algorithm을 이해해라. 만약 너가 3D쪽으로 작업한다면, 이것이 매우 도움이 될 것이다. 하지만 비록 너가 2D에서만 작업한다 할지라도, 그것은 노력할 가치가 있다. GJK 알고리즘은 매우 추상적이고 그것에 대한 직관력을 얻기에 어렵지만, 내가 본 것중에 가장 흥미로운 알고리즘들 중 하나이다. 그리고 그것은 똑같이 흥미로운 수학적 개념들에 기반을 둔다.

이렇게 되어있다.


여기서도 얼추 비슷한 순서로 되어있다.

저기 todo list에 비추어봤을 때,

1. 벡터수학은 어느정도 했다.
2. 할수 있는 가능한 다른 힘들은 아직 안했다.

현재 1번은 됐고 2번에 대해서 공부해야 하는데, 이것은 물리1 인강을 들으면서 자동적으로 해결 될 것 같다. 3번부터가 이제 실질적인 구현인데, 저 위의 링크가 그 순서대로 초심자부터 할 수 공부하며 할 수 있게 해놓았다.

따라서 내가 할 roadmap은

1. 물리 인강을 들으면서 여러가지 힘에 대해 이해를 한다.
2. 위의 링크에 소개된 자료들을 공부하고 openGL 상에서 구현한다.

1번은 지금 하루에 인강 두 개씩 잡아놔서 30일이면 물리1 강의가 끝난다. 물론 그 30일동안 물리 엔진 구현과 상관없는 것도 있지만 물리를 공부하는 것은 공학자의 영역에서 매우 좋은 것이다.

2번이 이제 가장 중요한데 이것에 대해 좀 철저한 계획을 세울 필요가 있다.

자료를 좀 더 세세하게 구분하자.

================================================
Soft Body Dynamics (준비 운동)
    Soft Body 예시들 (위의 본 내용 읽고, 아래 구현해보기)

Rigid Body Dynamics (본격 운동)
    소자료들 (읽고 이해하고, 구현해야할 것들)
    - 기본 수학 (2D rigid body mechanics)
    - Angular Effects (2D angular rigid body mechanics and overall 2D dynamics)
    - Collision Response (2D Physics 완료)
    - 3차원 (앞의 2차원을 3차원으로 확장)

- Chris Hecker 자료를 잘 공부한 후 레퍼런스로서 사용할 수 있는 것
    여기에서는 이해안되는 것을 세세한 내용을 보거나 필요한 내용 찾을 때 참고

- Box2D 제작자 Erin Catto의 설명들 (실질적인 구현 문제들 까지 다룬다)
    아래의 자료들을 읽고 이해할 줄 알아야하며, 구현도 할 줄 알아야 한다.
   - Erin Catto의 여러 GDC 프레젠테이션 (여러가지 세세한 기법들을 잘 소개함)

아마 여기까지 왔으면, 많은 시행착오를 거쳐서 멋져 보이는 물리 엔진을 만들 수 있을 것이다. 거기에 추가로. 이제 물리엔진에 미세한 튜닝들이 들어가게 도니다.

좀 더 현실적인 움직임을 위한 적분 방법
이 내용들은 아마 위에서 공부하면서 한 번씩 봤을 거지만, 자세히 더 공부한다고 생각

Collision Detection

실제 사용할 수 있는 게임 물리엔진 구조
- 게임 물리학 게시글들 by Gleen Fiedler

구현 예제 - 구현 예제 엄청 많은 것들이 모여져있음.
================================================

자료들을 정리했다. 이제 목표를 설정하자.
프로젝트 기한을 생각한다면, 9월까지는 내 게임에 적용할 수 있는 물리엔진을 9월까지는 만들어야 한다. 그 때 까지 할 것들을 생각해본다면

게임 기획
게임 렌더링 기획 (렌더링 프로그램 구조) + 구현
게임 물리 기획 + 구현
네트워킹 공부

이렇게 된다. 상당히 빡셀 예정이다.

하지만, 목표를 정해놔야 그것에 다가간다.

그래서 물리엔진 구현을 위한 현재 단기간 목표는
9월까지 본격운동 자료들을 다 공부하고, 물리엔진을 적용할 수 있게끔 내 지식을 올려놓고, 간단한 데모까지 내 OpenGL 렌더링을 적용하여 보일 수 있게 한다.

상당히 빡세다면, 게임 기획 + 네트워킹을 버리고, 렌더링과 물리엔진 구현만 잡아도 절반은 성공한 것이다. 그렇기에 이 물리엔진에 상당히 많은 것을 투자하자.

9월까지 Rigid Body Dynamics를 
이해하고 구현하여 내 프로그램에 적용하자.



댓글 없음:

댓글 쓰기