미완성. 영어실력이 일천하므로 의역이 대부분입니다. 지적 감사히 받습니다.
개인적인 학습을 위해 작성된 게시물이며 원 저작권은 Box2D 포럼에 있습니다.

매뉴얼의 각 챕터의 번역은 역자의 판단에 따른 중요도 순서대로 진행될 예정입니다.
2012년 12월 현재 원문 매뉴얼은 위키에서 제거되고 PDF화된 매뉴얼이 배포중입니다. 근시일내 PDF에 대한 번역작업을 새로이 진행할 것이며 이하 번역내용은 2009년의 것으로 현재 버전과 다른 점이 있을 수 있음을 유의하시기 바랍니다.

<일러두기>

1>번역기 돌린것보다 조금 나은 수준이지만 의미전달에는 크게 무리가 없다고 생각합니다. 오역 지적, 좀더 나은 의견은 감사히 받습니다.

2>이 글은 아직 작업 진행중입니다. 최종수정 11월 18일

<원문보기>


About 개요


강체는 위치와 속도를 가지며, 당신은 강체에 힘과 토크, 충격량을 가할 수 있다. 강체는 정적이거나 동적일 수 있다. 정적 강체는 절대 움직이지 않으며 다른 정적 강체와 충돌하지도 않는다.

강체는 모양들의 기반이 되며, 강체는 모양들을 세계 안에서 이끌고 다닌다. 강체는 Box2D에서 항상 강체이다.1) 이것은 같은 강체에 붙여진 두 모양이 절대로 서로 상대적인 이동을 할 수 없음을 의미한다.


당신은 일반적으로 당신이 만든 모든 강체의 포인터를 유지할 것이다. 이를 통해, 당신은 그래픽 엔티티의 위치를 갱신하기 위해, 강체의 위치를 확인할 수 있다. 또한 당신이 프로그램을 끝낼 때 모든 강체들을 제거하기 위해서도 그들 모두에 대한 포인터를 유지해야 한다. 2)

Body Definition 강체의 정의


강체가 생성되기 전에 먼저 당신은 강체의 정의를 먼저 생성해야 한다 (b2BodyDef). 당신은 강체의 정의를 스택에 생성하거나 당신의 게임의 자료구조 안에 정리해 둘 수 있다. 선택은 당신의 몫이다.Box2D는 강체의 정의 결과를 복사하며, 그에 대한 포인터를 유지하지 않는다. 이것은 당신이 강체의 정의를 여러 개의 강체를 생성하는
데 재사용할 수 있음을 의미한다.


강체 정의의 몇몇 중요한 멤버를 보러 가자.


Mass Properties 중량 속성


강체의 중량 속성을 확정하는 데는 몇 가지 방법이 있다.

  1. 강체의 정의에 중량 속성을 명시적으로 지정한다.
  2. 강체가 생성된 후 강체의 중량 속성을 명시적으로 지정한다.
  3. 강체에 붙여진 모양들의 밀도에 기반해 중량을 정한다.


많은 게임 시나리오에서는 모양의 밀도에 기반해 중량을 계산한다. 이것은 강체가 일관성있게 적당한 중량을 갖는 것을 보증한다.


그러나 그렇지 않은 게임 시나리오는 특정한 중량 값을 필요로 할 것이다. 예를 들면, 당신은 저울처럼 정확한 중량을 갖도록 조절할 필요가 있는 메커니즘을 사용하는 경우처럼.


You can explicitly set the mass properties in the body definition as follows:

당신은 다음과 같이 강체 정의의 중량을 명시적으로 설정할 수 있다.

bodyDef.massData.mass = 2.0; // 킬로그램 단위 강체 중량
bodyDef.massData.center.SetZero(); // 지역적 질량중심
bodyDef.massData.I = 3.0; // 회전 관성 in kg*m^2.
중량을 설정하는 다른 방법들은 본문의 다른 곳에서 소개할 것이다.


Position and Angle 위치와 각도

강체 정의는 당신에게 강체 생성시의 위치를 초기화할 기회를 준다. 이것은 세계의 원점에 강체를 생성한 후 이동하는 것보다 나은 퍼포먼스를 보인다.

강체는 두 개의 흥미로운 정점을 갖는다. 첫째는 강체의 원점이다. 모양들과 조인트는 강체의 원점에 상대적으로 붙여져 있다. 두 번째 흥미로운 정점은 질량중심이다. 질량중심은 강체에 붙여진 모양들의 질량 분포에서 결정되거나, b2MassData를 통해 명시적으로 지정할 수 있다. Box2D의 내부적 연산 대부분은 질량 중심을 사용한다. 예를들면 b2Body는 질량중심을 위해 선형 속도를 저장한다.(For example b2Body stores the linear velocity for the center of mass.)


당신이 강체 정의를 구성할 때는 질량중심이 어디에 위치할 것인지 알지 못할 것이다. 그러므로 당신은 강체의 원점을 질량중심으로서 간주한다(오역소지). 또한 강체의 각도를 라디안으로 지정할 것이다. 이는 질량중심의 위치에 영향을 받지 않는다.

당신이 나중에 강체의 중량을 변경한다면 질량중심이 강체 위에서 이동할 것이다. 그러나 원점은 움직이지 않으며 붙여진 모양과 조인트들도 움직이지 않는다.


bodyDef.position.Set(0.0, 2.0); // 강체의 원래 위치.
bodyDef.angle = 0.25 * b2Settings.b2_pi; // 호도법상 강체의 각도.


Damping 제동

제동은 강체의 속도를 줄이는 데 사용된다. 제동은 마찰과는 별개인데, 왜냐하면 마찰은 오직 충돌시에만 일어나고 제동은 마찰보다 시뮬레이션 비용이 적게 든다. 그러나 제동은 마찰을 대체할 수 없으며 두 가지 효과는 함께 사용되어야 한다.

제동 인자는 0과 무한대 사이에 있어야 한다. 0은 제동을 하지 않음을 의미하고 무한대는 최대한 제동을 거는 것을 의미한다. 일반적으로 당신은 0~1.0사이의 제동 값을 사용할 것이다. 나는 일반적으로 선형 제동을 사용하지 않는데 이것은 강체가 떠다니는 것처럼 보이기 떄문이다.


bodyDef.linearDamping = 0.0;
bodyDef.angularDamping = 0.1;

제동은 안정성과 퍼포먼스를 위해 근사된다. 작은 제동 값에서 제동 효과는 대개 타임스텝에서 독립적이다. 보다 큰 제동 값에서 제동 효과는 타임스텝에 따라 달라질 것이다. 이것은 당신이 고정된 타임스텝을 사용할 경우에는 별 문제가 되지 않는다. (이를 권장한다.)


Sleep Parameters 수면 인자

What does sleep mean? Well it is expensive to simulate bodies, sothe less we have to simulate the better. When a body comes to rest wewould like to stop simulating it.

수면이란 무엇을 의미하는가? 글쎄, 이것은 강체를 시뮬레이션하는 것의 확장이며, ....강체가 휴지상태가 될 때 우리는 그것을 시뮬레이션하지 않을 것이다.


Box2D가 강체(또는 강체의 묶음)을 휴지 상태로 만들 때 강체는 매우 작은 CPU오버헤드를 갖는 수면 상태로 들어간다. 만약 살아 움직이는 강체가 잠든 강체와 충돌한다면 잠든 강체가 깨어난다. 또한 강체들은 그들에게 붙여진 조인트나 컨택트가 파괴될 때도 깨어난다. 또한 당신은 수동으로 강체를 깨어나게 할 수 있다.


강체의 정의는 당신을 강체가 잠들 수 있는지, 그리고 강체가 수면 상태에서 생성될지 명시하도록 한다.

bodyDef.allowSleep = true;
bodyDef.isSleeping = false;


Bullets 탄환

게임 시뮬레이션은 보통 약간의 프레임 레이트 안에 재생되는 이미지들의 시퀀스를 생성한다. 이런 설정에서 강체는 한 타임스텝 안에서 먼 거리를 이동할 수 도 있다. 만약 물리 엔진이 큰 동작을 지원하지 않는다면 당신은 몇몇 물체들이 부정확하게 서로를 통과해버리는 것을 보게 될 것이다. 이런 효과를 터널링이라고 부른다.

기본적으로, Box2D는 동적인 강체들이 정적인 강체를 통과하는 터널링을 예방하기 위해 지속적 충톨탐색(continuous collision detection; CCD)를 사용한다. 이것은 모양들이 그들의 이전 위치에서 다음 위치까지 휩쓸고 지나감으로서 실행된다. 엔진은 휩쓰는 동안에 새로운 충돌을 찾는다. 그리고 그 충돌들을 위해 충돌지점(time of impact;TOI)를 계산한다. 강체들은 그들의 첫번째 TOI로 이동하고 최초 타임스텝의 끝까지 시뮬레이트한다. 이 처리 과정은 필요에 따라 반복된다.


일반적으로 CCD는 동적 강체들 간에는 사용되지 않는다. 이것은 퍼포먼스를 유지하기 위해서이다. 몇몇 게임 시나리오에서 당신은 동적 강체에서도 CCD를 필요로 할 것이다. 예를 들면, 당신은 고속의 탄환을 얇은 벽을 향해 발사하는 것을 원할 수도 있다. CCD가 없으면 탄환은 탄환은 벽에 구멍에 난 듯 통과해 버릴 것이다. (역주 : 의역 - the bullet my tunnel through thewall)

고속으로 이동하는 물체를 Box2D에서는 탄환이라 불린다. 당신은 당신의 게임 디자인을 기반으로 어떤 강체가 탄환이 될 것인지 결정해야 한다. 만약 당신이 어떤 강체를 탄환으로 취급하기로 결정했다면 다음과 같은 설정을 사용하라.


bodyDef.isBullet = true;

탄환 플래그는 동적 강체에만 적용된다.


CCD를 사용하는 대가는 비싸고 따라서 당신은 아마 모든 움직이는 강체를 탄환으로 취급하기를 원하지 않을 것이다. 그래서 기본적으로 Box2D는 CCD를 움직이는 강체와 정적 강체 사이에서만 사용한다. 이것은 강체가 당신의 게임 세계에서 벗어나지 않도록 예방하는 효과적인 접근방법 중 하나이다. 그러나 당신은 항상 CCD를 필요로 하는 몇몇 고속이동 강체를 갖고 있을 수도 있다.



Body Factory 강체 팩토리



강체는 세계 클래스에서 제공되는 강체 팩토리에 의해 생성되고 파괴된다. 이것은 세계가 효과적인 할당자를 사용해 강체를 생성하고 세계 자료구조에 추가하도록 한다.

강체는 질량 속성에 의해 동적이거나 정적일 수 있다. 둘 다 같은 생성/파괴 메소드를 사용한다.

var dynamicBody:b2Body = myWorld.CreateBody(bodyDef);
//... do stuff ...
myWorld.DestroyBody(dynamicBody);
dynamicBody = null;


정적 강체는 다른 강체의 영향에 의해서는 움직이지 않는다. 당신은 수동으로 정적 강체를 이동할 수 있지만, 동적 강체가 두 정적 강체 사이에서 찌그러지지 않도록 주의해야 한다. 마찰은 당신이 정적 강체를 이동하는 때는 정확하게 동작하지 않을 것이다. 정적 강체는 스스로 시뮬레이트되지 않으 결코 다른 정적 강체와 충돌을 발생시키지도 않는다. 하나의 정적강체에 몇 개의 모양을 붙이는 것이 하나의 모양을 가진 여러개의 정적 강체를 생성하는 것보다 빠르다. 내부적으로, Box2D는 정적 강체의 질량/질량 역수를 0으로 설정한다. 이것은 수학연산을 종료시키고 대부분의 알고리즘이 정적 강체를특수한 케이스로서 취급할 필요가 없게 한다.


Box2D는 강체 정의에 대한 참조나 그것을 유지하기 위한 어떤 데이터도 갖지 않는다.(유저데이터에 대한 포인터는 예외). 그러므로 당신은 임시적인 강체 정의를 생성하거나 같은 강체의 정의를 재사용할 수 있다.


Box2D는 당신이 b2World객체를 삭제함으로서 강체를 일일이 삭제할 필요를 없게 해주며, 이것은 당신을 위해 완벽한 정리작업을 해준다. 그러나 당신은 당신의 게임엔진 안에서 모든 강체에 대한 참조를 무효화해둬야 함을 유의해야 한다.

당신이 강체를 파괴했을 때, 붙여진 모양들과 조인트들은 자동적으로 파괴된다. 이것은 당신이 모양과 조인트 포인터를 어떻게 관리해야 하는지에 대한 중요한 의미를 내포하고 있다. 상세한 것은 9.2절 묵시적 파괴를 참고하라.


당신은 그라운드와 동적 강체를 조인트로 연결하려 할지도 모른다. 당신은 정적 강체와 연결하는 조인트가 필요할 것이다. 만약 정적 강체를 갖고 있지 않다면 당신은 공유되는 그라운드 강체를 세계 객체로부터 얻을 수 있다. 당신은 정적인 모양을 그라운드 강체에 붙일 수도 있다.


var ground:b2Body = myWorld.GetGroundBody();
//... 그라운드 강체를 사용한 조인트 생성 ...

Using a Body 강체의 사용

강체를 생성한 후에는, 당신이 강체를 동작하게 하는데 쓸 수 있는 여러 연산들이 있다. 그것은 질량 속성을 지정하는 것, 위치와 속도에 접근, 힘의 적용, 점과 벡터를 변환하는 것들을 포함한다.


Mass Data 질량

당신은 실행 시간에 강체의 질량값을 조절할 수 있다. 이것은 일반적으로 당신이 강체에서 모양을 생성하거나 파괴할 때 완료된다. 당신은 현재의 모양들에 기반해 강체의 질량을 설정하길 원할 것이다.

b2Body.SetMassFromShapes():void;


또한 당신은 직접 질량을 설정하길 원할수도 있다. 예를 들면, 당신이 직접 모양을 변경하지만 당신 고유의 질량 수식을 사용하려는 것처럼.


b2Body.SetMass(massData:b2MassData):void;

강체의 질량은 다음 함수를 통해 사용할 수 있다.
b2Body.GetMass():Number;
b2Body.GetInertia():Number;
b2Body.GetLocalCenter():b2Vec;

State Information 상태 정보

강체의 상태에는 여러가지 국면이 있다. 당신은 이 상태 데이터에 다음 함수들을 사용해 효과적으로 접근할 수 있다.


b2Body.IsBullet():Boolean;
b2Body.SetBullet(flag:Boolean):void;
b2Body.IsStatic():Boolean
b2Body.IsDynamic():Boolean;
b2Body.IsFrozen():Boolean;
b2Body.IsSleeping():Boolean;
b2Body.AllowSleeping(flag:Boolean):void;
b2Body.WakeUp():void;


The bullet state is described in Bullets. The frozen state is described in World Boundary.

탄환 상태는 탄환일 경우에만 기술된다. 냉각 상태는 세계 경계 밖에 있을 때 기술된다.


Position and Velocity 위치와 속도

당신은 강체의 위치와 회전값에 접근할 수 있다. 이것은 일반적으로 당신의 게임 액터가 렌더링 될 때 이다. 또, 당신이 평범하게 이동을 시뮬레이션 하는 데 Box2D를 사용하는 이상 흔하지 않은 경우이지만. 위치를 지정할 수 도 있다.


SetXForm(position:b2Vec2, angle:Number):Boolean;
GetXForm():b2XForm;
GetPosition():b2Vec2;
GetAngle():Number;

당신은 세계 좌표 위에서의 질량중심에 접근할 수 있다. Box2D의 내부적인 시뮬레이션 대부분은 질량중심을 사용한다. 그러나 당신은 일반적으로는 이에 접근할 필요가 없다. 대신 당신은 보통 강체의 변환값을 가지고 작업하게 될 것이다.

GetWorldCenter():b2Vec2;

당신은 선형속도와 각속도에 접근할 수 있다. 선형 속도는 질량중심을 위한 것이다.

function SetLinearVelocity(v:b2Vec2):void;
function GetLinearVelocity():b2Vec2;
function SetAngularVelocity(omega:Number):void;
function GetAngularVelocity():Number;

Forces and Impulses 힘과 충격량

You can apply forces, torques, and impulses to a body. When youapply a force or an impulse, you provide a world point where the loadis applied. This often results in a torque about the center of mass.

당신은 힘과 토크, 충격량을 강체에 적용할 수 있다. 상신이 힘이나 충격량을 적용할 때 당신은 이 부하가 적용될 세계 좌표를 지정해야 한다. 이것은 토크의 경우 대개 질량 중심에 해당한다.This often results in a torque about the center of mass. [todo:의역제거]


ApplyForce(force:b2Vec2, point:b2Vec2):void;
ApplyTorque(float32 torque):void;
ApplyImpulse(impulse:b2Vec2, point:b2Vec2):void;

Applying a force, torque, or impulse wakes the body. Sometimes thisis undesirable. For example, you may be applying a steady force and want to allow the body to sleep to improve performance. In this caseyou can use the following code.

힘과 토크 또는 충격의 적용은 강체를 깨운다. 때떄로 이것은 바람직하지 않다. 예를 들면, 당신은 지속적인 힘을 적용하고 ....[todo:빠진것]

이 경우에 당신은 다음과 같은 코드를 사용할 수 있다.


if (myBody.IsSleeping() == false)
{
myBody.ApplyForce(myForce, myPoint);
}

Coordinate Transformations 좌표변환

강체 클래스는 지역공간과 세계공간 사이에서 점과 벡터를 변환하는데 도움을 주는 유틸리티 함수를 몇 개 갖고 있다. 만약 당신이 이 개념을 이해하지 못한다면, Jim Val Verth와 Lars Bishop이 쓴 "게임과 상호작용적 애플리케이션을 위한 수학의 정수;Essential Mathematics for Games and Interactive Applications"를 읽기 바란다. 이들 함수는 효율적이므로 이들의 사용에는 비용이 들지 않는다.


GetWorldPoint(localPoint:b2Vec2):b2Vec2;
GetWorldVector(localVector:b2Vec2):b2Vec2;
GetLocalPoint(worldPoint:b2Vec2):b2Vec2;
GetLocalVector(worldVector:b2Vec2):b2Vec2;

Lists 열거

당신은 강체의 모양들을 열거할 수 있다. 이것은 주로 모양의 사용자 데이터에 접근할 필요가 있을 때 유용하다.

for (var s:b2Shape = body.GetShapeList(); s; s = s.GetNext())
{
var data:MyShapeData = s.GetUserData() as MyShapeData;
... do something with data ...
}

강체의 조인트 목록도 비슷한 방식으로 열거할 수 있다.




역주-

  1. Body는 엄밀히 말해서 굳고 무른 정도에 관계없이 물체를 지칭하지만 적당한 대안 단어가 없고, Box2D안에서 모든 물체는 모든 힘에 대해 형태가 변하지 않는 강체이기 떄문에 처음부터 Body를 강체로 번역했다.
  2. ActionScript 버전은 해당되지 않는 내용이다.