이 책은 일반적으로 사용되는 선형 대수학 및 충돌 감지 게임에 대한 포괄적인 안내서이지만 충돌 해결(물리) 주제에 대해서는 간략하게만 다루고 있습니다. 이 책은 다음과 같이 구성되어 있습니다.
이 책에서 다루는 모든 주제는 강체 물리 엔진을 점진적으로 구축하는 데 사용됩니다. 마지막 세 장(14, 15, 16)에서는 입자 물리학, 강체 물리학, 연체 물리학(천)을 구현합니다. 고급 주제, 이러한 주제 탐색을 위한 리소스, 게임 물리학 탐색을 위한 추가 리소스를 간략하게 다루는 부록이 제공됩니다.
책을 위해 만들어진 일부 그림은 인쇄용으로 잘 번역되지 않았습니다. 이 문제를 해결하기 위해 나는 이 저장소에 모든 책 그림을 포함시켰으며 그 그림을 https://github.com/gamephysicscookbook/Figures에 온라인으로 게시했습니다.
이 책의 처음 세 장은 게임 개발에 필요한 기본 선형 대수학을 가르치는 데 전념하고 있습니다. 모든 개념은 수학적 맥락에서 설명되고, 모든 개념에 대한 소스 코드가 제공되며, 시각적으로 탐색할 수 있는 경우 이미지도 제공됩니다. 처음 세 장 전체에 걸쳐 다음과 같은 데이터 구조가 생성됩니다.
vec2
)vec3
)mat2
)mat3
)mat4
)가능한 경우 행렬 연산은 일반적인 방식으로 구현됩니다. 예를 들어, 임의 크기의 두 행렬을 곱하는 코드가 제공됩니다.
이 책에서는 다음과 같은 교차점을 다룹니다.
가리키다 | 선 | 레이 | 구체 | AABB | OBB | 비행기 | 삼각형 | 절두체 | |
---|---|---|---|---|---|---|---|---|---|
가리키다 | |||||||||
선 | |||||||||
레이 | |||||||||
구체 | |||||||||
AABB | |||||||||
OBB | |||||||||
비행기 | |||||||||
삼각형 | |||||||||
절두체 |
14장은 단순한 입자 물리학을 다루고 있습니다. 이 장은 물리 루프를 설정하고 물리 루프의 일반적인 형식을 고려하는 방법을 소개합니다. 15장은 가장 흥미로운 장으로, 기본적인 강체 물리 엔진을 구현합니다. 기본 엔진은 방향이 지정된 상자 및 구를 지원하며, 스태킹이 작동하도록 만들 수 있지만 직접 지원되지는 않습니다. 16장에서는 스프링과 스프링을 사용하여 연체 물리학을 구현하는 방법을 다룹니다. 책의 마지막 데모는 소프트 바디, 천 물리학 데모입니다.
이 책은 나의 첫 번째 책이기 때문에 글쓰기 과정에 대해 많은 것을 배웠습니다. 아마도 계획에 관해 더 많은 것 같습니다. 다음은 내가 이 책을 집필하면서 제대로 계획하지 못한 사실을 발견한 목록입니다.
쿼터니언 : 쿼터니언을 갖는 것은 필수입니다! 나는 오일러 회전과 회전 행렬을 사용하여 책을 쓸 계획이었습니다. 이것이 효과가 있는 동안 쿼터니언에 접근할 수 있었다면 삶이 훨씬 더 쉬워졌을 것입니다.
평면 : 평면 교차점은 부울 값을 반환해서는 안 되며 교차점을 뒤, 교차, 앞으로 분류해야 합니다. 교차점이 앞이나 뒤에 있는 경우 거리 표시를 반환하는 것이 좋습니다. 이는 Frustum 컬링을 수행할 때 매우 유용합니다. 절두체에 대해 얼마나 깊이 있게 글을 쓸지 몰랐기 때문에 간단한 부울 교차를 하기로 결정했습니다.
Raycasting : 처음부터 Raycast 결과를 반환하도록 Raycast를 작성했어야 했습니다. 나중에 돌아가서 레이캐스팅 API를 다시 작성해야 하는 것은 내가 예상했던 것보다 텍스트로 표현하는 것이 더 복잡하다는 것이 밝혀졌습니다. 이것의 이면에 있는 어려운 점은 처음에는 일을 단순하게 유지하고 필요할 때만 복잡하게 만드는 것이었습니다.
소스 코드의 물리적 구현에는 다양한 문제가 있습니다. 이러한 문제는 이 책의 물리학 부분을 세 장으로 압축해야 한다는 사실에서 비롯됩니다. 견고한 강체 물리 시스템을 만드는 데 필요한 모든 것을 다루기에는 시간이 충분하지 않았습니다. 엔진의 가장 큰 문제점은 Arbiter가 없다는 점입니다.
중재자가 없으면 순차 임펄스 솔버를 구축할 수 없습니다. 이로 인해 우리는 다소 순진한 임펄스 솔버를 갖게 되었습니다. 문제는 임펄스가 프레임당 접촉별로 해결된다는 것입니다. 이로 인해 과도한 미끄러짐이 발생합니다. 선형 투영과 공격적인 마찰 바이어스를 사용하여 순차 임펄스의 부족을 보완했습니다. 오래된 물리 엔진은 문제를 가리기 위해 강한 수면에 의존하는 방식으로 비슷한 작업을 수행합니다. 말할 필요도 없이 수면은 구현되지 않았습니다.
이 책의 제2판을 쓸 기회가 생긴다면 2차원 충돌에 관한 장(4, 5, 6장)을 제거하고 장면 관리 장의 페이지 수를 줄이겠습니다. 나는 다음 주제를 다루기 위해 추가 페이지를 사용할 계획입니다.