3P by neo 5달전 | favorite | 댓글 1개

2D 강체 충돌 해결

문제 정의

  • 마리오가 구름을 밟는 것부터 레이싱 게임에서 두 자동차가 충돌하는 것까지, 충돌을 다루는 것은 대부분의 비디오 게임에서 매우 중요한 부분임.
  • 이 블로그 시리즈에서는 물리 시뮬레이션의 실제 수학과 물리학을 다룰 예정임.
  • 비디오 게임은 이러한 개념을 맥락화하고 덜 추상적으로 만드는 좋은 방법임.

수학에 대한 한마디

  • 이 글에서는 수학이 많이 등장하지만, 수학을 어려워하지 말기를 권장함.
  • 수학 표기법이 복잡해 보일 수 있지만, 대부분은 간단한 산술임.
  • 수학을 두려워하지 말고 도전해보기를 권장함.

시작하기 전에

강체

  • 강체 물리학은 변형되지 않는 물체를 다루는 물리 시뮬레이션임.
  • 실제로는 모든 물체가 분자 수준에서 변형되지만, 시뮬레이션에서는 이를 단순화하여 강체로 다룸.

충돌 감지와 충돌 해결

  • 충돌 감지는 장면에서 어떤 물체들이 충돌하는지 확인하는 과정임.
  • 충돌 해결은 충돌한 물체들이 어떻게 움직여야 하는지를 결정하는 과정임.
  • 이 블로그 시리즈에서는 충돌 해결 단계에 집중할 예정임.

우리가 하려는 일은?

  • 대부분의 게임은 큰 루프 안에서 실행됨.
  • 각 게임 루프 반복마다 물체의 위치가 현재 속도에 따라 업데이트됨.
  • 속도는 크기와 방향을 가진 벡터임.

속도

  • 속도는 일정 시간 동안 물체의 위치 변화를 나타냄.
  • 물체의 새로운 위치는 현재 속도와 시간 간격을 곱한 변위를 더하여 계산됨.

충돌 해결

  • 충돌 해결의 목표는 충돌 후 물체의 속도를 변경하여 물체들이 더 이상 서로 관통하지 않도록 하는 것임.
  • 충돌 후 속도는 충돌 전 속도와 충돌로 인한 속도 변화의 합으로 표현됨.

충돌이란 무엇인가?

  • 두 물체가 충돌 중인지 확인하려면 두 가지 조건이 충족되어야 함:
    1. 물체의 기하학적 형태가 접촉하거나 겹쳐야 함.
    2. 물체가 여전히 충돌을 향해 움직이고 있어야 함.

표면 법선

  • 물체를 표면에서 최대한 멀리 이동시키려면 표면에 수직인 방향으로 이동해야 함.
  • 이 방향을 법선 방향이라고 하며, 표면에 수직인 방향임.

내적

  • 두 벡터가 같은 방향을 가리키는 정도를 계산하려면 내적을 사용함.
  • 내적은 두 벡터의 대응 요소의 곱의 합으로 정의됨.
  • 내적의 부호를 통해 두 벡터가 같은 방향인지 반대 방향인지 알 수 있음.

결론

  • 충돌은 한 물체의 점이 다른 물체의 점과 접촉하고 상대 법선 속도가 음수일 때 발생함.
  • 다음 글에서는 충돌의 실제 물리학에 대해 다룰 예정임.

GN⁺의 의견

  • 물리 시뮬레이션의 중요성: 게임 개발에서 물리 시뮬레이션은 현실감을 높이는 중요한 요소임.
  • 수학의 역할: 수학은 물리 시뮬레이션의 핵심이며, 이를 이해하면 더 나은 시뮬레이션을 만들 수 있음.
  • 충돌 해결의 복잡성: 충돌 해결은 단순히 물체의 위치를 업데이트하는 것 이상으로 복잡한 과정임.
  • 교육적 가치: 이 글은 물리 시뮬레이션의 기초를 이해하는 데 큰 도움이 됨.
  • 추가 학습: 물리 엔진을 직접 구현해보는 것도 좋은 학습 방법임. Box2D나 Chipmunk 같은 오픈소스 물리 엔진을 참고할 수 있음.
Hacker News 의견

해커뉴스 댓글 모음 요약

  • Hey everyone, author here!

    • 블로그 시리즈의 첫 번째 글로, 게임 개발자가 아니거나 수학 배경이 약한 사람들을 대상으로 함.
    • 개념을 자세히 설명하는 이유는 이 때문임.
    • 질문이 있으면 언제든지 환영함.
  • Oh! Look, a well-researched, deeply-explained, and interactive post.

    • 도메인 이름과 TLD가 ".ski"인 것을 보고 다른 멋진 글을 쓴 저자일 줄 알았으나, 다른 사람이었음.
    • 글의 품질이 비슷하게 훌륭함.
    • ".ski" TLD의 비밀이 궁금함.
  • One side project I am working on right now is a 2d space shooter I am developing with my son.

    • 아들과 함께 2D 우주 슈팅 게임을 개발 중임.
    • 게임 엔진을 사용하지 않고 직접 구현해보려 했으나, 충돌 감지 문제에서 어려움을 겪음.
    • 결국 Box2D를 사용하기로 결정함.
    • 20년 이상의 개발 경험과 수학 배경이 있음에도 문제를 과소평가했음을 깨달음.
  • I always enjoyed the explanation from the N game: N game tutorial

    • 플래시가 유행하던 시절, N 게임의 설명을 즐겼음.
  • I had fun building a TypeScript demo about this topic, involving balls that can bounce and collide. I learned a lot.

    • 공이 튀고 충돌하는 TypeScript 데모를 만들며 많은 것을 배움.
    • 코드
    • 결과/데모
  • This is great. This reminds me of Chris Hecker's Rigid Body Dynamics series from GDMag/Gamasutra that I read (checks watch) almost 30 years ago!

  • Collisions are violations of the pairwise non-intersection constraint between bodies.

    • 충돌은 물체 간의 쌍방 비교차 제약 조건의 위반임.
    • 충돌력은 이러한 제약 조건의 라그랑주 승수임.
    • 충돌 노멀은 제약 함수의 부분 도함수임.
  • If you want to go further and go for rigid body dynamics and constraint, I found that series of blog post very useful: Toptal blog post

    • 강체 역학과 제약 조건에 대해 더 알고 싶다면, 이 블로그 시리즈가 유용함.
  • To dredge up a related oldie-but-goodie memory of blog posts: Gaffer on Games

  • Guess this is a Shameless plug but I wrote an interesting program over 12 years ago using even then very old three Js which is not quite the metal but much less abstract than today's tools.

    • 12년 전에 작성한 프로그램을 소개함.
    • Busy Boxes