Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

Jongbin Oh

May 09, 2022
Tweet

More Decks by Jongbin Oh

Other Decks in Programming

Transcript

  1. 8년차 게임 프로그래머 2010 ~ NCsoft 참여 프로젝트 프로젝트 뫼비우스

    마비노기 프로젝트 XR 허스키 익스프레스 리니지 3 관심 분야 game engine architecture algorithm unit test
  2. 게임 물리 엔진의 내부 동작 원리 이해 발표가 도움이 된다

    • 물리 엔진에 관심만 있다 • 물리 엔진에 대한 교양 수준의 지식이 필요 • 큰 그림을 보고 싶다 완전 낚시다 • 물리 엔진을 다뤄봤다 • soft body 설명을 기대 • 수학, 물리에 대한 깊은 설명을 기대 • CCD라니! 자세히 설명하는 거 아냐?
  3. 게임 물리 엔진의 내부 동작 원리 이해 - 물리 파이프라인부터

    CCD까지 자세히 보기보단 전체 흐름을 파악하자
  4. 게임 물리 엔진의 내부 동작 원리 이해 - 물리 파이프라인부터

    CCD까지 물리 시뮬레이션이 되기 까지 물리 엔진 가장 기초
  5. 게임 물리 엔진의 내부 동작 원리 이해 - 물리 파이프라인부터

    CCD까지 복잡하고 어렵다. 고급 주제는 간단히 언급
  6. 강체 rigid body 에 대해서만 설명 물리학에서 형태가 고정되어 변하지

    않는 물체를 가리킨다. 강체는 외력이 가해져도 모양이나 크기가 변형되지 않는다. - wikipedia
  7. 물리 파이프라인 bullet physics engine 물리 파이프라인 broad-phase collision detection

    collision과 rest의 구분 Continuous Collision Detection (CCD) 하지 못한 얘기
  8. 간단한 형태를 가진 물리 파이프라인을 소개 실제 사용하는 물리 엔진은

    당연히 더 복잡 간단한 형태지만 복잡한 물리 엔진을 이해하는데 도움이 된다 참고
  9. 강체에 적용되는 힘을 찾고 적용 힘은 물리학에서 질량을 갖는 물체의

    속도와 같은 운동상태를 변화시키거나 모양을 변화시키는 원인이 되는 물리량 - wikipedia 강체만 다루기 때문
  10. 𝑎 = 𝑓 1 𝑚 0으로 나누기 방지 절대 움직이지

    않는 오프젝트를 쉽게 표현. (inverseMass == 0) 강체는 mass가 아니라 inverseMass로 저장
  11. 𝜏 = 𝐼𝛼 관성모멘트 Moment of inertia 물체가 자신의 회전운동을

    유지하려는 정도를 나타내는 물리량으로서, 직선운동에서의 질량에 대응되는 양이다. - wikipedia
  12. 𝛼 = 𝜏 1 𝐼 얻고자 하는 건 각가속도 inverseMass와

    같은 이유로 inverseInertiaTensor 저장
  13. 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
  14. frame 1 frame 2 속도 point-face contact 다음 프레임에 관통

    가능성이 높다. 다음 프레임에서 처리하겠지. 뭐
  15. 𝑝1 𝑝2 Vector3 midLine = p2 – p1; Vector3 contactPoint

    = p1+midLine * 0.5f; float penetrationDepth = r1+r2-midLine.Length() 𝑟1 𝑟2
  16. struct Contact { Vector3 contactPoint; Vector3 contactNormal; float penetrationDepth; float

    restitution; RigidBody * rigidBody[2]; }; 반발계수. 뒤에서 설명
  17. 𝑚𝑎 𝑣𝑎 + 𝑚𝑏 𝑣𝑏 = 𝑚𝑎 𝑣′ 𝑎 +

    𝑚𝑏 𝑣′ 𝑏 운동량 momentum 보존 법칙 충돌 전 운동량 충돌 후 운동량
  18. 𝑣′ 𝑠 = −𝑐𝑣𝑠 충돌 전 속도 충돌 후 속도

    반발계수 coefficient of restitution 1 : 완전 탄성 충돌 0 : 완전 비탄성 충돌
  19. velocity 변경이 목적 힘을 사용한다면 가속도를 사용해 속도 변경 원하는

    속도로 변경 일정 기간 동안 힘을 작용해야 한다
  20. 𝑔 = 𝑓𝑡 = 𝑚∆𝑣 impulse - 순간적인 속도 변화

    일정 시간 - 물리 시뮬레이션 step
  21. impulsive torque - 순간적인 각속도 변화 일정 시간 - 물리

    시뮬레이션 step 𝑢 = 𝜏𝑡 = 𝐼∆𝜔
  22. 𝑔 = 𝑓𝑡 = 𝑚∆𝑣 𝑢 = 𝜏𝑡 = 𝐼∆𝜔

    구한 impulse를 바탕으로 속도와 각속도를 업데이트 impulse를 구할 때, 충돌하는 강체 질량 합을 바탕으로 계산 적용은 각 강체 질량을 바탕으로 적용
  23. origin penetration 앞에는 행복한 경우. 만약 penetration이 발생한 경우엔 추가로

    밀어주는 작업을 해야 한다. 밀어주는 방법 설명은 생략
  24. 물리 파이프라인 bullet physics engine 물리 파이프라인 broad-phase collision detection

    collision과 rest의 구분 Continuous Collision Detection (CCD) 하지 못한 얘기
  25. Forward Dynamics Broadphase Collision Detection Narrowphase Collision Detection Forward Dynamics

    Apply Gravity Predict Transforms Compute AABBs Detect Pairs Compute Contacts Solve constraints Integrate Position
  26. 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
  27. Forward Dynamics Narrowphase Collision Detection Forward Dynamics Apply Gravity Predict

    Transforms Compute Contacts Solve constraints Integrate Position Broadphase Collision Detection Compute AABBs Detect Pairs 충돌 검출 최적화를 위해 추가한 스테이지
  28. 물리 파이프라인 bullet physics engine 물리 파이프라인 broad-phase collision detection

    collision과 rest의 구분 Continuous Collision Detection (CCD) 하지 못한 얘기
  29. 매번 모든 강체에 대해 충돌 검사를 하는 건 괴롭다. sphere가

    아니라 복잡한 shape를 가진 강체라면 더 괴롭다.
  30. 모양 shape 에 따른 실제 충돌 검사를 하고 contact 정보를

    생성하는 건 비싼 작업 그래서 broadphase에서는 AABB, sphere 사용. 잠재적인 충돌 가능성이 있는 후보들을 골라내는 게 주 목적. 거짓 양성 false positive
  31. A B C D A B C D E 1.

    바운딩 볼륨에 충돌 2. A와 충돌 한다. 잠재적인 충돌 가능성이 있음 3. 4. 충돌 안 함 하위 노드 탐색 X
  32. 물리 파이프라인 bullet physics engine 물리 파이프라인 broad-phase collision detection

    collision과 rest의 구분 Continuous Collision Detection (CCD) 하지 못한 얘기
  33. 물리 파이프라인 bullet physics engine 물리 파이프라인 broad-phase collision detection

    collision과 rest의 구분 Continuous Collision Detection (CCD) 하지 못한 얘기
  34. 물리 파이프라인 bullet physics engine 물리 파이프라인 broad-phase collision detection

    collision과 rest의 구분 Continuous Collision Detection (CCD) 하지 못한 얘기
  35. 물리 파이프라인 bullet physics engine 물리 파이프라인 broad-phase collision detection

    collision과 rest의 구분 Continuous Collision Detection (CCD) 하지 못한 얘기
  36. - 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 Reference