2014년 2월 26일 수요일

[일기]Box2D, World.

World 클래스.

 이전까지 그나마 적합한 어휘를 찾았었지만 이건 좀 힘들다. 다른 사람들은 뭐라고 쓰고 있을까.

 장(Field)은 아닌 것 같으면서도 비슷하게 느껴진다. 계(界)가 가장 나을 듯 하다.

물리학을 공부할 때 나오는 번역인 그 계를 생각하면 된다. 조금 하는 일은 다르지만.

 계는 정의 그대로 우리가 생각하는 그 개념을 포함한다. Box2D에서는 이 계를 이용하여 강체를 생성하고 제거한다. 즉 계는 정의된 공간 안에서 실현되는 모든 물리적 상황을 통제한다. 고로 가장 중요한 요소라 할 수 있으며 우리는 계를 통해 중력을 정의하고, 물체의 움직임을 시연하고 나아가 특정 역영에 있는 물체(고정체)들을 찾아내며 광선던지기를 이용하여 교차하는 고정체를 찾을 수 있다.

 이전 공부한 예제에서는 Testbed 프레임워크에서 이미 제공하는 계를 이용했었다.

 계 또한 일반 클래스와 마찬가지로 생성 또한 간단히 할 수 있다. 인자로 중력을 받으므로 이를 미리 선언하면 된다.

 b2Vec2 gravity(0. -9.8);

 b2World* world = new b2World(gravity);

 이전 버전에서는 두번째 인자로 논리형 타입의 sleep 파라미터를 주었었는데 2.2.1 버전 이후로 이는 기본으로 참값으로 설정되어 적용된다. sleep 값이 적용되면 힘의 평형을 이룬 강체(이를 수면상태라 한다)들이 계의 물체 움직임 시연(충돌 판단 등의 대상)에서 제외된다. 이로 성능 향상을 기대할 수 있다. 수면 상태에 있는 강체들은 그것에 힘이 가해지거나 충돌이 이뤄지는 등의 현상이 발생했을 때 깨어나게 된다. 이후 버전에서는 b2World::SetAllowSleeping(bool) 메서드를 이용하여 그 논리값을 변경할 수 있다.

 계에는 Step 메서드가 있다. 한 단계의 물체 움직임을 시연한다. 인자로는 한 단계마다 적용될 시간 간격이 첫째로, 속도 보정 반복수, 위치 보정 반복수가 뒤이어 들어간다.

 충돌과 같은 현상이 일어났을 때, 강체의 고정체들간 겹치는 현상을 피하기 위해 각 강체들은 회전하거나 후퇴하게 되는데, 이 때 새로 계산될 후퇴 속도나 각속도 및 새로 도달한 위치의 정확한 계산을 하는데 있어 이 반복수는 최대 얼마만큼 반복해서 보정 계산을 하는지를 명시하는 수라고 보면 된다.

http://en.wikipedia.org/wiki/File:NewtonIteration_Ani.gif 여 확인할 수 있듯이, 함수의 해를 찾는 과정에서 5번의 과정을 거쳐 값을 보정해 나간 뒤, 결국 해를 찾아낸다.

 이와 마찬가지로 Box2D 에서는 충돌을 통해 결정될 후퇴속도 또는 위치를 결정하기 위해 최대로 값을 얼마나 반복하여 보정할지를 정하는 수로 위 보정수를 참고하게 된다. 단, 100을 지정해도 4번만에 참값에 가까운 근사값을 얻어냈다면 나머지 96번의 계산은 이루어지지 않는다.

 첫 인자인 시간 간격은 시연 후로부터 다음 시연 전까지 흘러간 시간을 의미하며, 물체가 다음 번에 시연될 때는 이 시간 간격만큼이 지난 후의 물체의 위치가 계산되어 나타나게 된다.

 가령 특정 강체가 오른쪽으로 초당 100m씩 고속으로 이동하고 있다고 하였을 때, 시간 간격으로 1초가 주어지면 우리 눈에는 왼쪽 0m 기준점에 있던 물체가 1초 후에 기준점으로 100m 떨어진 곳으로 순간이동한 것처럼 보일 것이다. 우리는 1번만에 물체를 이동시키나 순간이동은 매우 부자연스럽게 보일 수 있다.

 시간 간격이 0.01초였다고 한다면, 0.01초마다 물체가 1m씩 우측으로 이동된 모습이 보여질 것이며 100번만에 기준점으로부터 100m 떨어진 지점에 물체는 도달할 것이다. 또한 매우 짧은 간격으로 보여지므로 물체가 이동하는 경로가 자연스럽게 보여질 수 있다.

 계는 이를 통제하는 클래스가 따로 존재하지 않는 그 스스로가 상위 수준의 개념으로 작용한다. 따라서 제거는 매우 간편하게 이루어질 수 있다.

 delete pWorld;

 중요한 것은 이와 같은 구문이 실행되면 계에 연관된 강체나 접합점들도 함께 제거한다는 점이다.

댓글 없음:

댓글 쓰기