Post Lists

2018년 9월 19일 수요일

11 The Rigid-Body Physics Engine

11 The Rigid-Body Physics Engine
우리의 물리 엔진은 이제 full 3D에서 full rigid bodies를 재현할 수 있다. 그 spring forces와 다른 force generators는 이 접근법과 함께 작동할 것이다. 그러나 우리가 chapter 7에서 만났던 hard constraints는 그렇지 않을 것이다. 우리는 책의 다음 파트 (part IV)에서 충돌 탐지를 볼 것이고, part V에서 full 3D constraints로 돌아갈 것이다.

심지어 hard constraints 없이도, 여전히 우리가 할 수 있는 많은 것이 있다. 이 챕터는 그것들의 효과에 대해 hard constraints를 의존하지 않는 물리의 두 가지 적용을 본다: boats and aircraft. 우리는 flight simulator와 boat model을 구성할 것이다. flight simulator의 aerodynamics를 추가하는 것은 우리가 sailing simulation을 구성하도록 해준다.

11.1 Overview of The Engine
그 rigid-body physics engine은 두 가지 요소들을 갖는다:

  1. 그 rigid bodies는 그 자체로 그것들의 position, movement, 그리고 mass 특징들을 추적하다. 한 simulation을 설정하기 위해서, 우리는 rigid bodies가 필요로한 것을 처리할 필요가 있고, 그러고나서 그것들의 초기 position, orientation, 그리고 velocities (both linear and angular)를 설정할 필요가 있다. 우리는 또한 그것들의 inverse mass와 inverse inertia tensor를 설정할 필요가 있다. 한 오브젝트의 중력가속도는 또한 rigid body에서 유지되어야 한다. (이것은, 너가 바란다면, 한 force에 의해 제거되고 대체되어질 수 있다.)
  2. force generators는 게임의 몇 프레임 동안 적용되는 forces를 추적하기 위해 사용된다.
우리는 mass-aggregate system의 contact resolution system을 제거했다 (그것은 parts IV and V에서 다시 도입될 것이다).

우리는 재현될 오브젝트들을 관리하기 위해 chapter 8에서 도입했던 시스템을 사용할 수 있다. 이 경우에, 그러나, 그것들을 파티클이라기 보다는 rigid bodies이다. 그 World structure은 그에 따라서 수정된다:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* The world represents an independent simulation of physics. It
* keeps track of a set of rigid bodies, and provides the means to
* update them all
*/
class World
{
    // ... other World data as before
    /**
    * Holds a single rigid body in a linked list of bodies.
    */
    struct BodyRegistration
    {
        RigidBody* body;
        BodyRegistration* next;
    };
    /**
    * Holds the head of the list of registered bodies.
    */
    BodyRegistration* firstBody;
};
cs

이전 처럼, 각 프레임에서, 그 startFrame method가 처음에 호출된다. 그리고 그것은 각 오브젝트를 설정하는데, 그 각 오브젝트의 force와 torque accumulators를 0으로 만들고, 그것의 derived quantities를 계산하여 준비한다:

1
2
3
4
5
6
7
8
9
10
11
12
13
void GPED::World::startFrame()
{
    BodyRegistration* reg = firstBody;
    while (reg)
    {
        // Remove all forces from the accumulator
        reg->body->clearAccumulators();
        reg->body->calculateDerivedData();
        // Get the next registration
        reg = reg->next;
    }
}
cs

또 다시, 부가적인 forces들은 이 method를 호출한 후에 적용되어질 수 있다.

물리를 실행하기 위해, runPhysics method가 호출된다. 이것은 모든 force generators가 그것들의 forces를 적용하도록 하고, 그러고나서 모든 오브젝트의 integration을 수행한다:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void GPED::World::runPhysics(real duration)
{
    // First apply the force generators
    //registry.updateForces(duration);
    // Then integrate the objects
    BodyRegistration* reg = firstBody;
    while (reg)
    {
        // Integrate
        reg->body->integrate(duration);
        // Get the next registration
        reg = reg->next;
    }
}
cs

그것은 더 이상 collision detection system을 호출하지 않는다.

startFrame과 runPhysics에 대한 호출들은 game loop에서 같은 장소에서 발생할 수 있다.

내가 각 오브젝트의 updateTransform method에 대해 부가적인 호출을 했다는 것을 유의해라. 그것은 update동안 움직였을지도 모른다 (그리고 나중 section에서 collision resolution동안), 그래서 그것의 transform matrix는 렌더링 되기전에 업데이트 될 필요가 있다. 각 오브젝트는 그러고나서 차례로 rigid body의 transform을 사용하여 렌더링 된다.

11.2 Using The Physics Engine
이 물리엔진을 위한 두 샘플 프로그램들은 aerodynamics를 사용한다. 우리는 몇 가지 flight aerodynamics의 중요한 특징을 fake할 수 있는 새로운 force generator를 만들 것이다. 이것은 flight action game에서 사용하기에 적합한 기본적인 fight simulator를 만들기에 충분하다. 우리는 sailing simulator를 위한 sail model을 주도하기 위해 같은 generator를 사용할 것이다.

11.2.1 A Flight Simulator
물론, 땅을 제외하고는 flight simulator에서 contact physics는 필요가 없다. 많은 flight simulators들은 만약 너가 비행기에 있는 어떤 것과 부딪힌다면, 그러면 끝나게 되는 것을 가정한다: crash animation이 나오고, 그 플레이어는 다시 시작한다. 이것은 우리의 현재 엔진을 위한 완벽한 exercise ground를 만든다.

항공기의 역학은 공기가 그것의 표면위를 흘러가는 방식에 의해 생성된다. (이것은 CM과 상대적으로 움직이지 않는 표면을 포함한다, fuselage와 control surfaces같은. 이것은 wings와 rudder같은 모양을 움직이게 하거나 변화하도록 만들어질 수 있는 것이다.) 공기의 흐름은 forces가 생성되도록 야기한다. drag같은 몇몇은 aircraft가 움직이는 방향과 같은 방향으로 작용한다. 가장 중요한 힘인 lift는 공기의 흐름에 직각으로 작용한다. 항공기의 표면은 공기를 통해 다른 각도로 움직이기 때문에, force의 각 종류의 비율은 극적으로 바뀔 수 있다. 만약 그 날개가 공중을 가르고 있다면, 그것은 lift를 생성한다; 그러나 만약 그것이 수직으로 공중을 통해 움직인다면, 그것은 어떠한 lift도 생성하지 않는다. 우리는 민감한 aerodynamic forces를 생성할 수 있는 forcegenerator에서 이러한 종류의 행동을 포착할 수 있길 원한다.

The Aerodynamic Tensor
aerodynamic forces를 적절히 모델링 하는 것은 매우 복잡하다. 실제 항공기의 행동은 공기 움직임의 유체 역학에 의존한다. 이것은 몹시 무섭게 이 책의 범위를 넘어서는 수학을 포함하는 복잡한 원리이다. 실제로 현실적인 flight simulator를 만드는 것은 내가 탐험하고 싶지 않은 몇 가지 특수화된 물리학을 포함한다.

우리의 삶을 더 쉽게 만들기 위해, 나는 simplification을 사용할 것이다: the "aerodynamic tensor." 그 aerodynamic tensor는 공기가 표면위로 움직이는 속도만을 기반으로 비행기의 한 표면이 만들어내는 total force를 계산하는 것의 한 방법이다.

그 tensor는 행렬이다 : 3x3 행렬이고, 정확히는 inertia tensor를 위해 사용하는 것이다. 우리는 wind speed vector와 함께 시작하고, tensor를 사용하여 force vector를 주기위해 그것을 변환시킨다:



여기에서 f_a는 resulting force이고, A는 aerodynamic tensor이고, v_w는 공기의 속도이다. inertia tensor로 한 것처럼, 우리는 여기에서 좌표에 신경써야 한다. 공기의 속도와 resulting force는 둘 다 world coordintaes에서 표현되지만, aerodynamic tensor는 object coordinates에 있다. 또 다시, 우리는 이 함수를 적용하기 전에 매 프레임에 tensor의 기저를 바꿀 필요가 있다.

평면을 날리기 위해, 우리는 두 방법중 하나에서 control surfaces를 구현할 수 있다.그 첫 번째의 그리고 가장 정확한 것은 표면이 그것이 양 극단에 있을 때, aerodynamic characteristics를 나타내는 두 개의 tensors를 갖는 것이다. 매 프레임에서, control surface의 현재 위치는 현재 surface position을 위한 한 tensor를 만들기 위해 두 개의 tensor를 섞기위해 사용된다.

실제로, 세 개의 tensors가 가끔씩 필요하다. 두 개의 극단과, 거기에 control surface의 "normal" position를 더하여 나타내기 위해서이다. 예를들어, 날개와 줄지어 있는 aileron이 있는 날개 (각 날개의 뒤에있는 control surface)는 많은 lift와 적당한 양의 drag를 만들어 낸다. 이 위치에 있는 aileron과 함께, 위로 올라가거나 아래로 내려가든, 그 drag는 극적으로 증가하지만, 그 lift는 증가되어질 수 있거나 줄어들 수 있다 (끄것이 위로올라가거나 내려가는 것에 따라서).

두 번째 접근법은 실제로 그 전체 표면을 다소 휘게하는 것이다. 우리는 aerodynamic surface에 대한 방향을 저장하고 그 플레이어가 직접적으로 이 방향을 조종하게 하여 이것을 할 수 있다. 날개에 있는 aileron을 재현하기 위해서, 그 플레이어는 효과적으로 전체 날개를 휘게해야 할 지도 모른다. 그 날개가 방향을 바꾸게함에 따라, 그것에 대한 air flow는 바뀔 것이고, 그것의 aerodynamic tensor는 그에 따라 다른 힘을 만들어 낼 것이다.

The Aerodynamic Surface
우리는 이 기법을 사용하여 aerodynamic force generator를 구현할 수 있다. 그 force generator는 aerodynamic tensor와 함께 만들어진다. 그리고 그것은 주어진 점에 rigid body에 붙여진다. 이것은 모든 그것의 힘이 느껴지는 지점이다. 우리는 우리가 필요한 많은 표면을 붙일 수 있다. 그 force generator는 이렇게 보인다:

그 air velocity는 두 개의 값을 기반으로 계산된다 - prevailing wind와 rigid body의 속도. 그 prevailing wind는 방향과 바람의 크기 둘 다를 포함하는 한 벡터이다. 만약 그 rigid body가 움직이고 있지 않다면, 그것은 여전히 이 바람을 느낄 것이다. 우리는 바람을 추가하여 플레이어들의 일을 복잡하게 할 필요가 없는 flight game에 대해 이 값을 생략할 수 있다. 그러나, 우리의 sailing simulator를 모델링할 때, 그것은 매우 유용해질 것이다.

이 구현은 단일의 tensor만을 사용한다. control surfaces를 구현하기 위해, 우리가 이전에 보았었던 방법들 중 하나에서 이것을 확장할 필요가 있다. 나는 좀 더 정확한 접근법을 선택할 것이고, 그것의 연산의 극단에서 surface의 characteristics를 나타내는 세 개의 tensor와 함께:

각 control surface는 플레이어(또는 AI)의 컨트롤과 연결된 입력을 갖는다. 그것은 -1 ~ 1의 범위를 갖고, 거기에서 0은 "normal" position으로 고려된다. 그 세 개의 tensors는 이러한 세 개의 포지션과 부합한다. 세 개의 tensors중 두 개는 surface의 설정을 위해 현재 aerodynamic tensor를 형성하기 위해 서로 blended된다. 이 tensor는 그러고나서 world coordinates로 바뀌고, 이전처럼 사용된다.

Putting It Together
CD에서, flightsim demo는 작동하는 이 force generator를 보여준다. 너는 한 model aircraft를 통제한다 (조금 부가적인 어려움을 위해 땅으로부터 보여지는). aircraft에 적용되는 유일한 힘은 중력이다 (가속도 값으로 나타내어지는) 그리고 surface와 control surface force generators 그 aero dynamic forces도. 그림 11.1은 작동중인 aircraft를 보여준다.

나는 4개의 control surfaces를 사용했다: 두개의 wings, a tailplane, and a rudder. tailplane은 일반적인 surface force generator이고, 어떠한 control inputs이 없다 (실제 plane에서, 그 tailplane는 보통 control surfaces를 가지지만, 우리는 그것들이 필요하지 않다). 그것은 aerodynamic tensor 다음을 가진다



각 날개는 동일한 control surface force generator를 가진다. 나는 두 개를 사용했는데, 그것들의 control surfaces가 독립적으로 작동할 수 있게 하기 위해서이다. 그것들은 다음의 aero dynamic tensors를 사용한다:





control input의 각 극단에 대해, 그 플레이어가 항공기를 bank할 때, 두 날개 controls는 같은 방향으로 작동한다.  플레이어가 rolls(z축 기준으로 회전)를 할 때, 그 controls는 반대로 작동한다.

마지막으로 나는 rudder를 추가했다 - 항공기의 yaw(y축에 대한 회전)를 규제하는 vertical control surface. 그것은 다음의 tensor를 가진다:





그 표면들은 간단한 설정 함수에서 항공기에 추가되어진다. 그리고 그 게임 루프틑 정확히 우리가 이전에 보았던 것이다. 사용자 입력은 발생할 때 소프트웨어에게 알려준다 (이것은 데모를 작동시키기 위해 우리가 사용하는 OpenGL 시스템의 한 함수이다; 몇 엔진에서, 너는 입력을 explicitly하게 요청하는 한 함수를 호출해야 할지도 모른다.) 입력은 직접적으로 각 control surface에 대한 현재 값을 통제한다.

11.2.2 A Sailing Simulator
Boat racing은 hard constraints를 요구하지 않는 또 다른 장르이다. 적어도 그것의 가장 간단한 형태에서. 만약 우리가 bumping boats가 있는 close racing을 원한다면, 그러면 우리는 좀 더 복잡한 collision support를 추가할 필요가 있을지도 모른다. 우리의 목적을 위해서, 우리는 single player를 위한 simple sailing simulator를 구현할 것이다.

sail의 aerodynamics는 flight simulation을 위해 우리가 사용했던 aerodynamics와 매우 유사하다. 우리는 보트의 floating behavior를 본 후에 잠시 sail-specific setup에 돌아올 것이다.

Buoyancy
이 지점에서 재 방문될 필요가 있는 것은 우리의 buoyancy model이다. section 6.2.4에서, 우리는 파티클에 작용할 buoyancy force generator를 만들었었다. 우리는 rigid bodies를 다루기 위해서 이것을 연장할 필요가 있다.

잠수된 도형이 그것이 밀어내는 물의 질량에 의존하는 한 부력을 가진 것을 회상해라. 만약 그 물의 질량이 오브젝트의 질량보다 더 크다면, 그러면 net force는 위로 향할 것이고, 그 오브젝트는 떠다닐 것이다. 그 buoyancy force는 오직 잠수된 오브젝트의 volume에 의존한다. 우리는 buoyancy를 스프링처럼 다루어서 이것을 근사화했었다: 그 오브젝트가 더 점진적으로 가라앉을수록, 오브젝트가 완전히 물아래에 있다고 고려될 때 까지 그 힘은 증가한다; 거기에서, 그 힘은 그것의 최대이다. 그것은 더 깊은 깊이에서는 증가하지 않는다. 이것은 근사인데, 왜냐하면 그것은 잠수하는 오브젝트의 도형을 고려하지 않기 때문이다.

원래 힘은 직접적으로 파티클에 작용했었다. 이것은 공이나 다른 regular objects를 나타내는데 괜찮다. 그러나 실제 보트에서, 부력은 두 가지 일을 한다: 그것은 보트가 뜨게 유지하고, 그것은 보트가 직립하게 유지한다. 다시 말해서, 만약 그 보트가 기울기 시작한다면 (가령 강한 돌풍이 그것을 휘감아서), 그 부력은 그것을 올바르게 하기 위해 작용할 것이다.

올바르게 있으려는 이 경향은 부력의 torque component의 결과이다. 그것의 linear component는 그 보트가 뜨게하고, 그것의 torque는 그것이 수직으로 유지시킨다. 우리의 particle force generator에서와 다르게, 부력은 무게중심에 작용하지 않기 때문에 이것을 한다.

그 보트의 잠수된 부분은 a center of buoyancy를 갖는다. 그림 11.2에서 보여지듯이. center of buoyancy는 부력이 작용되고 있다고 생각될 수 있는 지점이다. 부력 그 자체 처럼, center of buoyancy는 displaced water과 관련이 있다. displaced water의 center of mass는 그것이 발생시키는 center of buoyancy와 같다.

그래서, displaced된 물의 부피가 잠수된 오브젝트의 도형에 의존하는 것처럼, center of buoyancy도 그렇다. 그 center of buoyancy가 center of mass와 더 멀수록, 더 많은 torque가 생성되고, 그 보트는 그 자체로 더 잘 서있으려고 할 것이다. 만약 center of mass가 center of buoyancy 위에 있다면, 그러면 그 torque는 반대 방향으로 적용될 것이고, 그 부력은 보트를 넘어뜨릴 것이다.

그래서 우리는 게임에서 이것을 어떻게 재현하는가? 우리는 물이 displaced되는 것의 도형의 지저분한 세부사항과 그것의 centerof mass를 찾는것에 관여하기를 원하지 않는다. 대신에, 우리는 rigid body에 대한 center of buoyancy를 고칠 수 있다. 실제 보트에서, center of buoyancy는 보트가 pitches and roll함에 따라 움직일 것이고, 다른 물의 부피가 displaced된다. center of buoyancy를 고치는 것은 대부분의 게임에 대해 이상하게 보이지 않는다. 그것은 그 자체로 큰 물결이 있는 것으로 보여주지만, 쉽게 고쳐질 수 있다. 우리가 나중에 보게 되듯이.

우리의 부력 generator는 attachment point를 취하여 업데이트디ㅗㄹ 수 있다; 만약 그렇지 않으면 이전처럼과 같다:


우리가 hull의 다른 부분을 나타내기 위해 한 보트에 다양한 buoyancy force generators를 부착하는 것을 막을 것은 없다. 이것은 우리가 center of buoyancy에서 몇 가지 shift를 재현하게 허용해준다. 만약 우리가 두 개의 buoyancy force generators를 가졌다면, 하나는 front (fore)에, 그리고 하나는 rear (aft)에, 그러고나서 그것이 앞뒤로 pitch 할 때 (예를들어, 물결ㄹ을 통해서), 그 fore and aft generators는 물의 다른 깊이에 있을 것이고, 그러므로 다른 힘들을 생성할 것이다. 그 보트의 매우 잠수된 front는 빠르게 pitch up할 것이다. 많은 attachments 없이, 이것은 거의 믿을만해 보이지 않을 것이고, 명백히 부정확할 것이다.

우리의 sailing simulator를 위해, 우리는 두 개의 hulls과 4개의 buoyancy force generators를 가진 한 catamaran을 사용할 것이다: 한 개의 fore and 한 개의 aft on each hull.

The Sail, Rudder, and Hydrofoils
우리는 우리의 보트를 위해 sail과 rudder를제공하기 위해 aerodynamics를 사용할 것이다. 그 rudder는 항공기에 있는 rudder와 같다: 그것은 보트가 직진하도록 유지하기 위해 작용한다 (또는 플레이어의 명령에 회전하기 위해). 많은 항해하는 보트에서, rudder와 dagger board가 둘 다 있다. 그 dagger board는 보트가 지석으로 움직이게 유지하고, 그것이 쉽게 바람이 sail을 감돌 때 쉽게 전복되지 않도록 하는 큰 vertical fin이다. 그 rudder는 회전으로부터 휘어질 수 있는 더 작은 vertical fin이다. 우리의 필요를 위해서, 우리는 그 두개를 하나로 합칠 수 있다. 사실, 많은 고 성능 sailing boats에서, 그 두 개는 한 개의 구조로 결합된다.

그 sail은 보트의 주된 driving force이다. 바람을 forward motion으로 바꾸면서. 그것은 aircraft wing처럼 작동을한다. air flow를 lift로 바꾸면서. sailing boat의 경우에, 그 lift는 보트가 앞으로 추진하도록 사용된다. sail이 간단히 그 air를 "catches"하고, 그 공기가 그 보트를 앞으로 끌어온다는 잘못된 개념이 있다. 이것은 확실히 성취될 수 있지만, 한 extra sail (the spinnaker)가 종종 이용된다. 그 보트의 aerodynamic drag를증가시키기위해, 그리고 그것이 물과 상대적으로 끌어당겨지게 된다. 대부분의 경우에, 그러나, 그 sail은 패러슈트보다는 날개처럼 좀 더 작용한다. 사실, 가장 빠른 보트들은 그것들의 sails로부터 믿을 수 ㅇ벗는 lift를 얻을 수 있고, 바람 속도보다 상당히 더 빠르게 이동할 수 있다.

그 rudder and the sail 둘 다 control surfaces이다: 그것들은 최고의 성능을 얻기위해 조절되어 질 수 있다. 그것들은 둘 다 그것들의 행동을 수정하기 위해, control surfaces를 튕겨내기보다는 회전되어진다. (비록 그 sail이 어떤 보트에 조절되는 그것의 tension을 가질 수 있을지라도). 우리는 그러므로 두 번째 가능한 adjustment approach from section 11.2.1을 사용하여 control surfaces에 대한 force generators를 구현할 것이다 : control surface를회전시키는 것. 그 force generator는 이것처럼 보인다:


그 generator가 surface를 위한 한 방향을 유지하고, 이것을 사용하는 것에 유의해라. rigid body의 방향과 결합하고, 이것은 aerodynamic surface를 위한 최종 transformation을 만들기 위해서이다. 오직 한 개의 tensor가 있지만, 그것이 변형되는 행렬은 이제 rigid body의 방향과 control surface의 조정가능한 방향의 결합이다.

비록 내가 그것들을 우리의 예쩨에 넣지 않았을지라도, 우리는 또한 보트에 wings를 추가할 수 있다: 물 밖으로 그것을 들어올리는 hydrofoils. 이러한 것은 한 항공기에서 날개처럼 작동한다. vertical lift를 만들면서. 일반적으로 hydrofoil boat에서, 그것들은 hull의 어떤 부분보다 더 낮게 위치된다. 그 lift는 보트를 물 밖으로 들어오린다 (거기에서, 물론 어떠한 부력도 없지만, hull로부터 drag도 없다), 그리고 오직 그 hydrofoils만이 잠수되어 있다.

그 hydrofoils는 수정된 surface force generators로서 쉽게 구현되어질 수 있다. 그 수정은 그 보트가 날기 시작하지 않도록 확실히 할 필요가 있다: 그것은 그 foil이 물을 떠나게 하기만 하면 어떠한 lift도 만들지 않는다. 실제로, 한 hydrofoil은 종종 물 밖에 더 높이 있는보트를 더 작은 lift를 만들도록 설계된다. 이것은 그 보트가 빠르게 그것의 최적 cruising height에 도달하게 하기 위해서이다. 이 행동은 또한 구현하기에 어렵지 않을 것이다; 그것은 오직 그 hydrofoil이 물의 표면에 얼마나 가까이에 있는지를 기반으로 tensor-generated force를 스케일링하는 것을 요구한다.

The Sailing Example
그 sailboat demo는 모든 이러한 것들을 합쳐 넣었다. 너는 calm ocean에서 catamaran을 조종할 수 있다. 그 sail과 rudder의 방향들은 너가 만들 수 있는 유일한 adjustments이다. 그 prevailing wind direction과 strength는 표시된다. 너가 screenshot in figure 11.3에서 볼 수 있듯이.

그 보트는 4개의 bouyancy force generators, sail, 그리고 rudder로 설정된다. 그 wind direction은 시간에 따라 무작위로 느리게 변화한다. 간단히 recency-weighted random function으로 각 프레임에서 업데이트된다.

그 보트의 업데이트는 정확히 aircraft demo와 같고, 사용자 입력 또한 이전처럼 다뤄진다.

11.3 Summary
이 챕터에서, 우리는 실제 게임 예제의 한 집합을 만났는데, 거기에서 우리의 물리엔진은 믿을만한 시뮬레이션을 만들기 위해 실제 세계의 물리학 지식과 결합한다. sailing and flight의 두 가지 경우에 대해, 우리는 빠르고 쉽게 믿을 만한 행동을 만들어내기 위해 fluid dynamics의 간단화를 사용한다.

aerodynamic tensor는 flight or sailing accuracy를 재현하려고 하는 게임에 대해서는 충분히 정확하지 않지만, 현실적인 것을 의도하지 않는 게임에 대해서는 완벽히 충분하다.

내가 이 챕터를 위해 선택했던 상황은 물리 엔진을 당황하게 하지 않기 위해 그러나 신중하게 선택되었다. 그것이 나타내듯이, 우리의 엔진은 우리가 이 책의 part 2에서 만든 mass-aggregate engine보다 덜 능력이 있다. 그것이 진정으로 실용적이게 하기 위해, 우리는 collision을 다시 추가할 필요가 있다. 불행하게도, chapter 7에서 봤던 것보다, 상당히 좀 더 복잡한 프로세스가 된다. 회전도 더해져서. 그것을 옳게 할 시간을 가질 가치가 있다.

그러한 마음으로, 우리가 충돌 물리학을 다시 고려하기 전에, 우리는 우리의 게임에서 충돌을 탐지하고 보고할 코드를 구성할 것이다. 그 책의 Part IV는 그것을 한다.

========================================================

이 챕터도 이전 spring and buoyancy를 particle로 재현하는 챕터처럼 상당히 불명확하고 정확하지 않다. 그래서 그냥 해석만 했다. 다음 챕터부터 충돌탐지 반응에 대해서 하니까, 이것을 잘 따라 구현하면 내가 원하는 것을 할 수 있을것이라고 생각한다.

















댓글 없음:

댓글 쓰기