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

94
NCsoft 오종빈 [email protected] 게임 물리 엔진의 내부 동작 원리 이해 - 물리 파이프라인부터 CCD까지 2012.04.24

Upload: -

Post on 23-Jun-2015

9.315 views

Category:

Technology


2 download

TRANSCRIPT

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

NCsoft 오종빈

[email protected]

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

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

2012.04.24

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

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

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

관심 분야 game engine architecture algorithm unit test

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

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

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

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

• 큰 그림을 보고 싶다

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

• soft body 설명을 기대

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

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

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

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

@ohyecloudy

http://www.slideshare.net/ohyecloudy

http://ohyecloudy.com/pnotes

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

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

강체 물리 엔진이 기본인

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

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

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

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

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

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

물리 엔진 가장 기초

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

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

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

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

강체rigid body에 대해서만 설명

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

- wikipedia

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

깊게 게임 물리 엔진을

살펴보기보단

전체 흐름을

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

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

물리 파이프라인

bullet physics engine 물리 파이프라인

broad-phase collision detection

collision과 rest의 구분

Continuous Collision Detection (CCD)

하지 못한 얘기

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

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

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

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

참고

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

물리 파이프라인

force generators

rigid-body update (integrator)

contact generator

contact resolution

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

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

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

- wikipedia 강체만 다루기 때문

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

가장 대표적인 힘이 중력

부력buoyancy

항력drag

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

𝑓 = 𝐺𝑚1𝑚2

𝑟2

만유인력universal gravity

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

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

𝑓 = 𝐺𝑚𝑒𝑎𝑟𝑡ℎ𝑚

𝑟2

𝑔 = 9.807𝑚𝑠−2

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

𝑓 = 𝑚𝑔

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

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

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

물리 파이프라인

force generators

rigid-body update (integrator)

contact generator

contact resolution

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

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

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

𝑓 = 𝑚𝑎 → 𝑎 = 𝑓1

𝑚

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

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

𝑎 = 𝑓1

𝑚

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

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

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

𝑥 = 𝑥0 + 𝑣0𝑡 +1

2𝑎𝑡2

위치 업데이트

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

𝑣 = 𝑣0 + 𝑎𝑡

속도 업데이트

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

𝜏 = 𝐼𝛼

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

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

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

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

- wikipedia

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

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

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

matrix로 표현

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

𝛼 = 𝜏1

𝐼

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

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

𝜔 = 𝜔0 + 𝛼𝑡

각속도 각가속도

각속도 업데이트

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

물리 파이프라인

force generators

rigid-body update (integrator)

contact generator

contact resolution

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

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

contact를 생성한다.

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

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

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

총 6가지 contact types

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

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

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

point-face contact

edge-edge contact

face-face contact

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

edge-face contact

point-edge contact

point-point contact

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

point-point contact (vertex-vertex contact)

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

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

frame 1 frame 2

속도 point-face contact

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

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

𝑟1 𝑟2

𝑑

𝑑 ≤ 𝑟1 + 𝑟2

충돌

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

𝑝1 𝑝2

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

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

𝑝1 𝑝2

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

𝑟1 𝑟2

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

contact normal

penetration depth

contact point

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

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

반발계수. 뒤에서 설명

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

물리 파이프라인

force generators

rigid-body update (integrator)

contact generator

contact resolution

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

contact를 다룬다

contact generator에서 넘어온

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

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

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

′𝑏

운동량momentum 보존 법칙

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

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

𝑣′𝑠 = −𝑐𝑣𝑠

충돌 전 속도 충돌 후 속도

반발계수coefficient of restitution

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

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

velocity 변경이 목적

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

원하는 속도로 변경

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

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

𝑔 = 𝑓𝑡 = 𝑚∆𝑣

impulse - 순간적인 속도 변화

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

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

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

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

𝑢 = 𝜏𝑡 = 𝐼∆𝜔

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

origin

𝑓

contact point

𝑝𝑓

𝜏 = 𝑝𝑓 × 𝑓 외적

변위

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

𝜏 = 𝑝𝑓 × 𝑓 외적

변위

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

𝜏 = 𝑝𝑓 × 𝑓

𝑢 = 𝑝𝑓 × 𝑔

impulsive torque impulse

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

impulse, impulsive torque가 뭔지 알았다.

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

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

이전 프레임 현재 프레임

contact normal

contact point

속도

origin

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

충돌 후 속도

origin

충돌 전 속도

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

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

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

origin

impulse

impulsive torque를 구한다

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

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

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

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

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

origin

penetration

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

밀어주는 방법 설명은 생략

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

물리 파이프라인

bullet physics engine 물리 파이프라인

broad-phase collision detection

collision과 rest의 구분

Continuous Collision Detection (CCD)

하지 못한 얘기

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

Forward Dynamics

Broadphase Collision Detection

Narrowphase Collision Detection

Forward Dynamics

Apply Gravity

Predict Transforms

Compute AABBs

Detect Pairs

Compute Contacts

Solve constraints

Integrate Position

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

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

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

Forward Dynamics

Narrowphase Collision Detection

Forward Dynamics

Apply Gravity

Predict Transforms

Compute Contacts

Solve constraints

Integrate Position

Broadphase Collision Detection

Compute AABBs

Detect Pairs

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

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

물리 파이프라인

bullet physics engine 물리 파이프라인

broad-phase collision detection

collision과 rest의 구분

Continuous Collision Detection (CCD)

하지 못한 얘기

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

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

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

더 괴롭다.

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

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

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

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

거짓 양성false positive

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

Bounding Volume Hierarchies (BVH)

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

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

A

B C

D

A B C D

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

A

B C

D

A B C D

E

1. 바운딩 볼륨에 충돌

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

3.

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

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

Sweep and Prune (SAP)

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

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

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

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

물리 파이프라인

bullet physics engine 물리 파이프라인

broad-phase collision detection

collision과 rest의 구분

Continuous Collision Detection (CCD)

하지 못한 얘기

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

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

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

지면

중력

지면 impulse 생성 충돌 후 속도

지면

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

지면

중력

반력reacting force

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

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

연속된 impluse로 흉내

microcollisions

반력을 연속된 impulse로 대체

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

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

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

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

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

물리 파이프라인

bullet physics engine 물리 파이프라인

broad-phase collision detection

collision과 rest의 구분

Continuous Collision Detection (CCD)

하지 못한 얘기

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

Discrete Collision Detection

time step에서 충돌을 계산

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

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

t=0 t=1 t=2

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

t=0 t=1 t=2

충돌 없이 통과 터널링 발생

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

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

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

이산적discrete

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

기본 아이디어 하나만 소개

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

어렵다

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

t=0

t=1

A

검출해야 할 contact point, normal

B

B

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

A-B

Configuration Space Obstacle (CSO)

Minkowski addition으로 생성

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

A-B

GJK-based ray cast

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

물리 파이프라인

bullet physics engine 물리 파이프라인

broad-phase collision detection

collision과 rest의 구분

Continuous Collision Detection (CCD)

하지 못한 얘기

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

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

어떤 순서로 할 것인가?

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

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

force-based로 constraint를 같이 계산

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

with jacobian matrix

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

물리 파이프라인

bullet physics engine 물리 파이프라인

broad-phase collision detection

collision과 rest의 구분

Continuous Collision Detection (CCD)

하지 못한 얘기

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

- 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