Upload
-
View
9.315
Download
2
Embed Size (px)
Citation preview
NCsoft 오종빈
게임 물리 엔진의 내부 동작 원리 이해
- 물리 파이프라인부터 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