U E D R , A S I H C RSS

이민석/물리엔진 (rev. 1.8)

이민석/물리엔진

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

이 책의 온라인 사이트: http://procyclone.com/

게임 물리 엔진은 크게 세 개로 나눈다.
  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.
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:30:31
Processing time 0.0306 sec