U E D R , A S I H C RSS

이민석/물리엔진

제 물리 엔진을 완성할 때까지 이 페이지는 정리가 불가능한 아수라장일 것입니다... -.-

Ian Millington의 책 Game Physics Engine Development를 보고 만드는 3D 게임 물리 엔진. 게임 물리 엔진이기 때문에 실시간 강체 시뮬레이션을 중점적으로 다룬다.

<Game Physics Engine Development>의 온라인 사이트: http://procyclone.com/

헐 여기 기가 막히게 정리해놨다
http://www.slideshare.net/ohyecloudy/ndc12-12668524

이게 진리였다 Physically Based Modelling: Principles and Practice
http://www.cs.cmu.edu/~baraff/sigcourse/index.html


게임 물리 엔진은 크게 세 개로 나눈다.
  1. 입자 엔진(particle engine)
  2. 질량 집합체 엔진(mass aggregate engine)
  3. 강체 엔진(rigid body engine)

입자 엔진

입자 엔진은 모든 물체를 크기 없는 입자(particle)로 표현한다. 입자에 힘(force)을 작용하면 입자가 움직인다. 고등학교 물리 시간에 단일 물체의 가속 운동이니 힘의 작용 따위를 배웠을 텐데 단순히 그런 물체를 동시에 수천 개 움직일 수 있다고 보면 된다. 사실 충돌 처리도 없어서 물리 엔진이라고 부르기에는 조금 그렇다.

최신 게임을 보면 화면 상에 불빛이 날아다니거나 피가 튀기는 등의 효과를 자주 볼 수 있는데 이는 주로 입자 엔진으로 구현한 것이다.

particle_engine_sample_00.png
[PNG image (37.62 KB)]


particle_engine_sample_01.png
[PNG image (57.84 KB)]



질량 집합체 엔진

질량 집합체 엔진은 입자들을 용수철(spring) 또는 막대(rod) 같은 구속(constraint)으로 묶어 하나의 물체처럼 시뮬레이션할 수 있다. 예를 들어 하나의 상자 집합체는 점 4개와 막대 6개로 구성된다.

현실에서 물체는 수많은 입자들로 구성되는데, 질량 집합체 엔진은 물체의 핵심 입자들만 가지고 그 물체를 기술하려는 접근법으로 이해할 수 있다.

질량 집합체 엔진에서는 물체의 회전을 따로 구현할 필요가 없는데 가령 모서리의 한 입자를 잡고 끌면 나머지 점들이 따라오면서 자동으로 회전되기 때문이다.

이해하기도 구현하기도 매우 쉬우나 물체의 골격만으로 어설프게 시뮬레이션하기 때문에 복잡한 물체를 질량 집합체로 만들면 물체가 찌그러진다든지 움푹 패인다든지 조금씩 변형이 일어난다. Locoroco라면 모를까 의자를 바닥에 집어 던졌는데 의자가 고무공처럼 출렁이는 것을 바라지는 않을 것이다.

형태가 간단한 물체는 질량 집합체로 만들어도 매우 튼튼하기 때문에 간단한 시뮬레이션을 하기에는 매우 적합하다. 단 복잡한 물체를 질량 집합체로 만들려고 했다가는 구속의 수가 폭발적으로 증가하기 때문에 실시간 실행이 불가능해질 수 있다.

mass_aggregate_engine_sample_00.png
[PNG image (57.12 KB)]

입자 20개를 생성하고 모든 쌍을 용수철로 연결하면 자연스레 균형을 이루어 안정된 구조로 수렴한다.

mass_aggregate_engine_sample_01.png
[PNG image (62.92 KB)]

사각형은 입자 4개와 막대 6개, 삼각형은 입자 3개와 막대 3개로 구성된다.

mass_aggregate_engine_sample_02.png
[PNG image (44.79 KB)]

몸의 관절들을 입자로 보고 막대로 연결하면 플래시 게임 DeadDrunk의 그 졸라맨을 만들 수 있다. 지 혼자 춤사위


강체 엔진

강체 엔진은 물체들을 변형되지 않는 기하학적 도형으로 간주한다. 물체의 밀도는 균일하다고 가정하는 경우가 대부분이며 그에 따라 질량 중심은 기하학적 중심과 같다.

  • 강체 엔진을 이루는 기술들
    • 3D 변환: 4x4 행렬과 사원수
    • 회전 운동: 돌림힘(torque), 관성 모멘트
    • 충돌 검출(걸러내기): 경계 볼륨 계층도, 공간 분할 트리, 격자
    • 충돌 검출(정밀검사): 분리축 정리(Separating Axis Theorem), 접촉(contact) 정보 생성
    • 충돌 해결: 여기 배우는 중...

13장 접촉 생성 요약
영어 책을 읽으면 필기도 영어로 하게 되는 마술 -.-
Coherence: a technique to extend algorithms that only generate one contact

  • Generating Contact Data with SATs
    • SAT generates only one contact... not enough
    • But we don't need to alter the algorithm. what?
    • The idea is COHERENCE.
      1. In each frame, generate single contact with SAT.
      2. Solve it in the normal way.
      3. It is likely that the objects will interpenetrate again.
      4. Run SAT again. Now we will get a new contact near the previous contact. Let's say them ContA and ContB.
      5. Keep track of ContA and ContB, resolve them together!

This process relies on the fact that - objects don't move too far from frame to frame.
This is called coherence.
A contact in one frame is likely to be still almost a contact in the next frame.


14장. 충돌 해결(Collision Resolution)

회전하는 강체들의 충돌 후 선속도 & 각속도 구하는 공식
impulse.png
[PNG image (4.99 KB)]


혹시 모르니 LaTeX 수식 저장용
j = \frac{-(1+e) V_{rel}^{-}}{\frac{1}{M_a} + \frac{1}{M_b} + \hat{n}\cdot \left ( {I_a}^{-1} \left ( \vec r_a \times \hat n \right ) \times \vec r_a \right ) + \hat{n}\cdot \left ( {I_b}^{-1} \left ( \vec r_b \times \hat n \right ) \times \vec r_b \right ) } \\ \\ \\
\vec{v_a}^{+} = \vec{v_a}^{-} + \frac{j \hat n}{M_a} \\ \\ \\
\vec{w_a}^{+} = \vec{w_a}^{-} + {I_a}^{-1} \left ( \vec r_a \times j \hat n \right )
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2014-11-27 11:51:06
Processing time 0.4936 sec