[NDC12] 게임 물리 엔진의 내부 동작 원리 이해

Post on 23-Jun-2015

9.315 views 2 download

Transcript of [NDC12] 게임 물리 엔진의 내부 동작 원리 이해

NCsoft 오종빈

ohyecloudy@ncsoft.com

게임 물리 엔진의 내부 동작 원리 이해

- 물리 파이프라인부터 CCD까지

2012.04.24

8년차 게임 프로그래머 2010 ~ NCsoft

참여 프로젝트 프로젝트 뫼비우스 마비노기 프로젝트 XR 허스키 익스프레스 리니지 3

관심 분야 game engine architecture algorithm unit test

게임 물리 엔진의 내부 동작 원리 이해 발표가

도움이 된다 • 물리 엔진에 관심만 있다

• 물리 엔진에 대한 교양 수준의 지식이 필요

• 큰 그림을 보고 싶다

완전 낚시다 • 물리 엔진을 다뤄봤다

• soft body 설명을 기대

• 수학, 물리에 대한 깊은 설명을 기대

• CCD라니! 자세히 설명하는 거 아냐?

발표자료는 늦어도 내일부터 공유할 예정

@ohyecloudy

http://www.slideshare.net/ohyecloudy

http://ohyecloudy.com/pnotes

게임 물리 엔진의 내부 동작 원리 이해 - 물리 파이프라인부터 CCD까지

강체 물리 엔진이 기본인

게임 물리 엔진의 내부 동작 원리 이해 - 물리 파이프라인부터 CCD까지

자세히 보기보단 전체 흐름을 파악하자

게임 물리 엔진의 내부 동작 원리 이해 - 물리 파이프라인부터 CCD까지

물리 시뮬레이션이 되기 까지

물리 엔진 가장 기초

게임 물리 엔진의 내부 동작 원리 이해 - 물리 파이프라인부터 CCD까지

복잡하고 어렵다. 고급 주제는 간단히 언급

강체rigid body에 대해서만 설명

물리학에서 형태가 고정되어 변하지 않는 물체를 가리킨다. 강체는 외력이 가해져도 모양이나 크기가 변형되지 않는다.

- wikipedia

깊게 게임 물리 엔진을

살펴보기보단

전체 흐름을

파악할 수 있게 도와주는 발표

물리 파이프라인

bullet physics engine 물리 파이프라인

broad-phase collision detection

collision과 rest의 구분

Continuous Collision Detection (CCD)

하지 못한 얘기

간단한 형태를 가진 물리 파이프라인을 소개

실제 사용하는 물리 엔진은 당연히 더 복잡

간단한 형태지만 복잡한 물리 엔진을 이해하는데 도움이 된다

참고

물리 파이프라인

force generators

rigid-body update (integrator)

contact generator

contact resolution

강체에 적용되는 힘을 찾고 적용

힘은 물리학에서 질량을 갖는 물체의 속도와 같은 운동상태를 변화시키거나 모양을 변화시키는 원인이 되는 물리량

- wikipedia 강체만 다루기 때문

가장 대표적인 힘이 중력

부력buoyancy

항력drag

𝑓 = 𝐺𝑚1𝑚2

𝑟2

만유인력universal gravity

중력 상수 두 점질량 사이 거리

𝑓 = 𝐺𝑚𝑒𝑎𝑟𝑡ℎ𝑚

𝑟2

𝑔 = 9.807𝑚𝑠−2

𝑓 = 𝑚𝑔

중력이 작용하는 모든 강체에 적용

(0, -9.8, 0) y-up 좌표계

물리 파이프라인

force generators

rigid-body update (integrator)

contact generator

contact resolution

받은 힘을 적용하고 위치와 속도를 구한다

𝑓 = 𝑚𝑎 → 𝑎 = 𝑓1

𝑚

힘으로부터 가속도를 알 수 있다.

𝑎 = 𝑓1

𝑚

0으로 나누기 방지 절대 움직이지 않는 오프젝트를 쉽게 표현. (inverseMass == 0)

강체는 mass가 아니라 inverseMass로 저장

𝑥 = 𝑥0 + 𝑣0𝑡 +1

2𝑎𝑡2

위치 업데이트

𝑣 = 𝑣0 + 𝑎𝑡

속도 업데이트

𝜏 = 𝐼𝛼

돌림힘(torque, 토크) 각가속도Angular acceleration

𝜏 = 𝐼𝛼 관성모멘트Moment of inertia

물체가 자신의 회전운동을 유지하려는 정도를 나타내는 물리량으로서, 직선운동에서의 질량에 대응되는 양이다.

- wikipedia

𝜏 = 𝐼𝛼 관성모멘트Moment of inertia

스칼라 관성모멘트 관성텐서inertia tensor

matrix로 표현

𝛼 = 𝜏1

𝐼

얻고자 하는 건 각가속도 inverseMass와 같은 이유로 inverseInertiaTensor 저장

𝜔 = 𝜔0 + 𝛼𝑡

각속도 각가속도

각속도 업데이트

물리 파이프라인

force generators

rigid-body update (integrator)

contact generator

contact resolution

강체 사이에 발생한 충돌을 찾는다.

contact를 생성한다.

처리는 뒤에서 알아서 해주겠지

모양shape에 따른 충돌 알고리즘 선택

총 6가지 contact types

bullet physics engine

box sphere convex, cylinder, cone,

capsule

compound

triangle mesh

box boxbox spherebox gjk compound concaveconvex

sphere spherebox spheresphere gjk compound concaveconvex

convex, cylinder, cone,

capsule

gjk gjk gjk compound concaveconvex

compound compound compound compound compound compound

triangle mesh

concaveconvex concaveconvex concaveconvex compound gimpact

point-face contact

edge-edge contact

face-face contact

edge-face contact

point-edge contact

point-point contact

point-point contact (vertex-vertex contact)

contact data를 제대로 생성하기 힘들어 보통 무시

frame 1 frame 2

속도 point-face contact

다음 프레임에 관통 가능성이 높다. 다음 프레임에서 처리하겠지. 뭐

𝑟1 𝑟2

𝑑

𝑑 ≤ 𝑟1 + 𝑟2

충돌

𝑝1 𝑝2

Vector3 midLine = p2 – p1; Vector3 contactNormal = midLine.Normal();

𝑝1 𝑝2

Vector3 midLine = p2 – p1; Vector3 contactPoint = p1+midLine * 0.5f; float penetrationDepth = r1+r2-midLine.Length()

𝑟1 𝑟2

contact normal

penetration depth

contact point

struct Contact { Vector3 contactPoint; Vector3 contactNormal; float penetrationDepth; float restitution; RigidBody * rigidBody[2]; };

반발계수. 뒤에서 설명

물리 파이프라인

force generators

rigid-body update (integrator)

contact generator

contact resolution

contact를 다룬다

contact generator에서 넘어온

충돌 전 움직임으로부터 충돌 후 움직임을 계산

𝑚𝑎𝑣𝑎 +𝑚𝑏𝑣𝑏 = 𝑚𝑎𝑣′𝑎 +𝑚𝑏𝑣

′𝑏

운동량momentum 보존 법칙

충돌 전 운동량 충돌 후 운동량

𝑣′𝑠 = −𝑐𝑣𝑠

충돌 전 속도 충돌 후 속도

반발계수coefficient of restitution

1 : 완전 탄성 충돌 0 : 완전 비탄성 충돌

velocity 변경이 목적

힘을 사용한다면 가속도를 사용해 속도 변경

원하는 속도로 변경

일정 기간 동안 힘을 작용해야 한다

𝑔 = 𝑓𝑡 = 𝑚∆𝑣

impulse - 순간적인 속도 변화

일정 시간 - 물리 시뮬레이션 step

impulsive torque - 순간적인 각속도 변화

일정 시간 - 물리 시뮬레이션 step

𝑢 = 𝜏𝑡 = 𝐼∆𝜔

origin

𝑓

contact point

𝑝𝑓

𝜏 = 𝑝𝑓 × 𝑓 외적

변위

𝜏 = 𝑝𝑓 × 𝑓 외적

변위

𝜏 = 𝑝𝑓 × 𝑓

𝑢 = 𝑝𝑓 × 𝑔

impulsive torque impulse

impulse, impulsive torque가 뭔지 알았다.

그리고 impulse로 impulsive torque를 계산할 수 있다는 걸 알았다.

이전 프레임 현재 프레임

contact normal

contact point

속도

origin

충돌 후 속도

origin

충돌 전 속도

충돌 전, 후 속도와 충돌하는 강체 질량으로 impulse를 구할 수 있다.

origin

impulse

impulsive torque를 구한다

𝑔 = 𝑓𝑡 = 𝑚∆𝑣 𝑢 = 𝜏𝑡 = 𝐼∆𝜔

구한 impulse를 바탕으로 속도와 각속도를 업데이트

impulse를 구할 때, 충돌하는 강체 질량 합을 바탕으로 계산 적용은 각 강체 질량을 바탕으로 적용

origin

penetration

앞에는 행복한 경우. 만약 penetration이 발생한 경우엔 추가로 밀어주는 작업을 해야 한다.

밀어주는 방법 설명은 생략

물리 파이프라인

bullet physics engine 물리 파이프라인

broad-phase collision detection

collision과 rest의 구분

Continuous Collision Detection (CCD)

하지 못한 얘기

Forward Dynamics

Broadphase Collision Detection

Narrowphase Collision Detection

Forward Dynamics

Apply Gravity

Predict Transforms

Compute AABBs

Detect Pairs

Compute Contacts

Solve constraints

Integrate Position

Forward Dynamics

Broadphase Collision Detection

Narrowphase Collision Detection

Forward Dynamics

Compute AABBs

Detect Pairs

Integrate Position

Compute Contacts

Apply Gravity

Predict Transforms

force generator

rigid-body update

contact generator

Solve constraints

contact resolution

Forward Dynamics

Narrowphase Collision Detection

Forward Dynamics

Apply Gravity

Predict Transforms

Compute Contacts

Solve constraints

Integrate Position

Broadphase Collision Detection

Compute AABBs

Detect Pairs

충돌 검출 최적화를 위해 추가한 스테이지

물리 파이프라인

bullet physics engine 물리 파이프라인

broad-phase collision detection

collision과 rest의 구분

Continuous Collision Detection (CCD)

하지 못한 얘기

매번 모든 강체에 대해 충돌 검사를 하는 건 괴롭다.

sphere가 아니라 복잡한 shape를 가진 강체라면

더 괴롭다.

모양shape에 따른 실제 충돌 검사를 하고 contact 정보를 생성하는 건 비싼 작업

그래서 broadphase에서는 AABB, sphere 사용.

잠재적인 충돌 가능성이 있는 후보들을 골라내는 게 주 목적.

거짓 양성false positive

Bounding Volume Hierarchies (BVH)

AABB 베이스 혹은 sphere 베이스를 주로 사용 여기선 설명이 쉽게 sphere 사용

A

B C

D

A B C D

A

B C

D

A B C D

E

1. 바운딩 볼륨에 충돌

2. A와 충돌 한다. 잠재적인 충돌 가능성이 있음

3.

4. 충돌 안 함 하위 노드 탐색 X

Sweep and Prune (SAP)

3d physics engine에서는 3d를 사용. 편하게 설명하기 위해서 2d 예제

박스를 만들고 (3d에선 AABB) 축에 프로젝션한 값을 저장

물리 파이프라인

bullet physics engine 물리 파이프라인

broad-phase collision detection

collision과 rest의 구분

Continuous Collision Detection (CCD)

하지 못한 얘기

지금까지 impulse 기반 엔진을 설명했다. 모든 충돌을 impulse로 해결하기 때문에 collision과 rest 구분이 어렵다.

지면

중력

지면 impulse 생성 충돌 후 속도

지면

지면

중력

반력reacting force

반력(reacting force)을 구하는 방법

연속된 impluse로 흉내

microcollisions

반력을 연속된 impulse로 대체

vibration 현상만을 중점적으로 없애는 방법

이전 프레임 가속도를 사용해 속도를 없앤다

속도가 아주 작을 때, 반발계수를 낮춘다

물리 파이프라인

bullet physics engine 물리 파이프라인

broad-phase collision detection

collision과 rest의 구분

Continuous Collision Detection (CCD)

하지 못한 얘기

Discrete Collision Detection

time step에서 충돌을 계산

터널링tunneling 현상이 발생할 수 있다

t=0 t=1 t=2

t=0 t=1 t=2

충돌 없이 통과 터널링 발생

궤적은 연속적이라 여기지만

위치 계산은 time step 마다 하기 때문

이산적discrete

기본 아이디어 하나만 소개

CCD로만 발표를 하나 할 정도로 엄청난 분량

어렵다

t=0

t=1

A

검출해야 할 contact point, normal

B

B

A-B

Configuration Space Obstacle (CSO)

Minkowski addition으로 생성

A-B

GJK-based ray cast

물리 파이프라인

bullet physics engine 물리 파이프라인

broad-phase collision detection

collision과 rest의 구분

Continuous Collision Detection (CCD)

하지 못한 얘기

앞에서 간단하게 contact resolution을 설명

어떤 순서로 할 것인가?

하나씩 순차적으로 한다면 순서에 영향을 받게 됨

force-based로 constraint를 같이 계산

impulse-based 에서 문제가 됐던 반력도 계산

with jacobian matrix

물리 파이프라인

bullet physics engine 물리 파이프라인

broad-phase collision detection

collision과 rest의 구분

Continuous Collision Detection (CCD)

하지 못한 얘기

- game physics engine development 2nd edition - bullet physics engine - Realtime Rigid Body Simulation Using Impulses - Scott Lembcke - wikipedia - Sweep-and-prune - Pierre Terdiman - GDC09 Collision Detection Crash Course - Gino van den Bergen - Continuous Collision Detection and Physics - Erwin Coumans - Iterative Dynamics with Temporal Coherence - Erin Catto - Timewarp Rigid Body Simulation - Brian Mirtich - Ray Casting against General Convex Objects with Application to

Continuous Collision Detection – GINO VAN DEN BERGEN

Refe

rence