2D 물리 엔진은 어떻게 구축합니까? [닫은]


20

내가 만든 가장 진보 된 게임은 물리 엔진 Box2dFlashAS3로 만든 8 볼 풀 게임과 레벨이있는 ​​플랫폼 게임입니다.

플랫폼 게임을 할 때 항상 엔진을 만드는 방법을 알고 싶어서 재사용 할 수있었습니다. 기울기, 곡선 기울기, 완벽한 중력 및 실제 물리가있는 게임을 볼 때 항상 엔진을 코딩하는 방법을 알고 싶었습니다.

관련 기술 자료가 필요한 기술과 기사를 제안하십시오.


답변:


16

내가 추천 반면 그 일을 경험 이외의 아무것도 자신의 물리 엔진을 압연 (당신이 완료되면 당신은 아마 그것을 멀리 던져해야 실현 - 그것은 모든 edgecases 및 숫자 제한을 얻기 위해 정말 열심히 / 안정성 문제는 정리 , 기존 엔진에 기여하면 시간을 훨씬 더 잘 활용할 수 있습니다.) 다음은 몇 가지 리소스입니다.

풀 홀 레슨 : 원 또는 구 사이의 빠르고 정확한 충돌 감지 원 / 원 및 구 / 구 충돌에 대해 설명합니다.

N 튜토리얼 을 분리 한 축 정리 기반의 탐지 및 대응에 대한 기본적인 이해를위한 훌륭합니다.


9

Erin Catto는 Box2D의 구현에 대한 모든 GDC 강의를 온라인으로 제공합니다. Box2D에도 필자가 경험 한 간단한 코드가 있습니다.


pdf는 정말 힘든 자료입니다. 그러나 cpp 및 h 파일을 읽을 때 "이해할 수 있습니다". 감사합니다.
Vishnu

+1. Box2D는 또한 안정성에 대해 매우 신중합니다. 자신을 굴릴 때 매우 어려운 것 중 하나입니다.
leander

5

방법은 다음과 같습니다.

대략적인 움직임

모든 물리 객체에는 다음 벡터가 필요합니다.

  • 위치 : 물체가있는 곳.
  • 속도 : 위치 변경 방법.
  • 가속 : 속도가 어떻게 변하는 지.

직관적으로, 모든 물리 객체에 대해 매 프레임마다 이런 종류의 작업을 수행해야합니다 a.

a.speed    += a.acceleration
a.position += a.speed

함정 : 이것을 오일러 통합 방법 이라고합니다. 이 근사치는 작은 속도와 가속 및 작은 시간 간격으로 더 좋습니다. 게임에서 이것은 일반적으로 사실입니다. 그러나 물체가 얇은 벽쪽으로 또는 다른 움직이는 물체쪽으로 직접 빠르게 이동하는 경우, 물체를 완전히 가로 지르기에 충분한 양만큼 증분 될 때 해당 물체와의 충돌을 건너 뛸 수 있습니다. 빠르게 움직이는 물체가 있는 경우이 문제를 해결 하려면 연속 충돌 감지 가 필요할 수 있습니다.

충돌

충돌은 다음과 같은 순서로 근사 할 수 있습니다.

  1. 감지 : 두 물체가 교차하는 것을 감지합니다.
  2. 해결 : 각 바디의 위치가 변경되어 더 이상 교차하지 않습니다.
  3. 물리 : 운동량, 마찰 및 회복 (바운스 니스)을 설명하기 위해 각 신체의 속도가 변경됩니다.

불연속 시점에서 발생하기 때문에이를 불연속 충돌 감지라고합니다. 각 단계마다주의를 기울여야합니다.

1 단계 : 충돌 감지 (충돌이 있습니까?)

를 들어 두 개의 원 : 그 중심이 더 떨어져 자신의 반지름의 합보다 경우 그냥 확인.

를 들어 두 개의 사각형 : 확인 자신의 코너 좌표의 다른 사각형 내에있는 경우.

들어 더 복잡한 다각형을 포함 아무것도 , 당신은해야합니다 분리하기 축-정리 또 다른 질문에 대한 주제입니다.

함정 : 실제로 고려해야 할 다른 충돌 유형이 많이 있습니다. 볼록 다각형은 여러 번 교차 수 있습니다 !

2 단계 : 충돌 해결 (분리)

충돌을 해결하는 간단한 방법 은 충돌 탐지에서 얻은 값을 사용하여 최소 침투변환하는 것 입니다. 이것은 본질적으로 가능한 최소 이동 거리로 물체를 분리하는 것과 관련이 있습니다.

예를 들어, 원 중 하나가 제자리에 고정 된 원-원 충돌을 고려하십시오. 최소 변위 벡터는 중간 점 벡터 간의 차이와 동일한 방향을 갖습니다. 길이는 반경의 합과 중심 사이의 거리의 차이입니다.

이 아이디어는 다른 모양으로 쉽게 일반화됩니다.

함정 : 충돌하는 두 물체가 움직일 수있는 경우, 움직임의 근사치를 얻기 위해 두 거리를 전체 거리의 일부만큼 움직여야 할 수도 있습니다. 분명히 다른 방향으로 움직여야합니다.

3 단계 : 충돌 물리학 (기타 변경 사항)

발생하는 가장 확실한 것은 하나 또는 두 개의 객체가 방향을 바꾸는 것, 즉 속도 벡터를 회전시키는 것입니다. 이것은 구현하기가 매우 쉽습니다.

함정 : 물체는 탄력적 일 수도 있지만 그렇지 않을 수도 있습니다 .이 경우 시스템의 총 에너지가 줄어 듭니다. 공기 저항으로 인해 드래그 가 필요할 수 있습니다 . 마찰 (특히 정적 마찰 )은 구현하기 가 매우 복잡합니다 .

몇 가지 결론

시뮬레이션하려는 경우 현실 시뮬레이션이 기하 급수적으로 어려워집니다. 셀 수없이 많은 최첨단 사례, 엄청나게 어려운 공식 및 끊임없이 증가하는 연구 논문의 지뢰밭으로 들어가고 있습니다.

당신의 요구가 단순하거나 배우고 싶어한다면, 그것을 시도하십시오.

요구 사항이 복잡하거나 수학을 좋아하지 않는 경우 물리 엔진 을 통해 세부 사항을 살펴보십시오. Box2DBullet 은 게임에서 꽤 인기가 있습니다.



4

1
wildbunny 블로그 항목은 훌륭합니다. +1.
공산주의 오리

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.