( 들어 가면서 )

1. 한글화 목적 : jbox2d 를 위한 기초작업
                     작성자 : 나
                     번역 태클 : 언제든지 해주세요 !!!!!

2. 출처 http://box2d.org/manual.pdf



Box2D의 배포버전에는 Hello World project이 포함 되어 있습니다. 
프로그램은  커다란 ground박스와 하나의 작은 박스를 생성합니다. 
이코드 에는 그래픽적 요소가 없습니다. 
당신이 볼수 있는것은 모든 시간에 대해서 box의 위치를 콘솔로 텍스트로 볼 수 있을 겁니다.

이것은 box2d의 실행과 어떻게 시작해야 할지에 대한 좋은 예를 제공 할수 있습니다.

 
2.1 Creating a world 
모든 box2d 프로그램은  b2World object를 생성하는 것으로 시작한다. 
b2World는 물리공간과 프로그래머의 연결점입니다. b2World는 메모리, 객체, 시뮬레이션
을 관리합니다. 물리공간을 stack과 heap 과 section에 위치 시킬수 잇습니다.

Box2D world 생성하는 것은 매우 쉽습니다. 
첫번째로  중력 벡터를 정의 해야 합니다. (중력의 방향과 중력의 값)
또한 바디들 비활성상태 상태 인지 아닌지를 결정하는 것을 world가 알게 해주어야 한다. 
비활성 상태를 sleep이라고 하는데  sleep 상태이 바디들은 시뮬레이션요청을 받지 않는다.

b2Vec2 gravity(0.0f, -10.0f);
bool doSleep = true;

월드 오브젝트를 생성한다. 아래에 나오는 것은 stack에 world를 생성하는 것이다,
이때 월드는 범위(무슨 범위?) 안에 있어야 한다.
 b2World world(gravity, doSleep);

정리 코드

b2Vec2 gravity(0.0f, -10.0f);
bool doSleep = true;
b2World world(gravity, doSleep); 



이제 물리월드(물리 공간)이 생성되었고 이제 다른요소들을 추가 해보자.

 
2.2 creating a ground Box (바닥 상자 만들기)
바디를 생성하기 위한 단계는 아래와 같다. 

step1. 바디의 위치와 제동(damping)을 정의한다. 
step2. world object를 이용해서 body를 생성하라.
step3. shape와 friction 과 densitiy 와 함께 fixtures 을 정의하라. 
step4. body위에 fixtures을 생성하라




첫번째 단계을 위해서 그라운드 바디를 생성한다. 
이때 생성되는 바디의 정의가 필요하다. 이 정의를 가지고 
그라운드 바다의 초기위치를 정한다.

b2BodyDef groundBodyDef;

groundBodyDef.position.Set(0.0f, -10.0f);



두번째 단계에서는 바디의 정의가 바다의 생성을 위해서 월드 오브젝트로 전달된다. 
월드 오브젝트는 바디정의 에 대한 레퍼런스를 유지하지 않는다 . 바디들은 초기화에 대해
고정적이다. 이 고정적인 바디 (static bodies)들은 다른 static body와 충돌하지 않고
움직이지 안는다. 

b2Body* groundBody = world.CreateBody(&groundBodyDef);



세번재 단계로 그라운드 폴리곤을 생성한다. SetAsBox를 이용해서 그라운드 폴리곤을
box shape 으로 만들어라, 이 박스는 부모의 바디원형에 센터에 자리 잡는다.

b2PolygonShape groundBox;

groundBox.SetAsBox(50.0f, 10.0f);


SetAsBox 함수는 인자값으로 높이와 길이의 1/2값을 받는다  (센터에 맞추니까)
그래서 이 경우에 그라운드 바디는 x축 100단위이고  y축 20 단위이다. 
Box2D의 단위는 KMS 단위로 조정된다.  그래서 위에 넣은 값은 미터단위로  생각해볼수 있다
Box2D 는 오브켁트가 실세계의 사이즈를 기초로 했을때 잘 동작한다.
예를 들어 베럴(오크통)은 높이가 1미터 정도이다. 부동소숫점 연산의 제한때문에 
glaciers(빙하?)나 먼지 입자의 움직임 모델링은 좋은  생각이 아니다. 



마지막 4번째로 shape fixture을 만들어야 한다. 이번 단계에서 간단한 방법이 있다. 
기본 fixture의 요소의 속성을 변화 시킬필요 없다. 픽스쳐의 정의없이 그냥 shape를 바로 body에 전달한다. 이후에 커스터마이징을 위한 fixture을 알아 보겟다. 두번째 파라미터는 shape의 입방미터당 킬로그램 즉 밀도이다.  static body는 디폴트로 0 이다. 그래서 이번 경우에는 사용하지 않는다 

groundBody->CreateFixture(&groundBox, 0.0f);



Box2d 는 shape의 레퍼런스를 유지하지않는다 그 데이터는(레퍼런스) b2Shape 오브젝트에 복사된다. 


주의: 모든 fixture는 부모 body를 가져야한다. (단연한 말이다) 심지어 static(전역?) 이라도 말이다. 그러나  모든 static fixture를 하나의 static body에 붙일수는 있다. 



2.3 Creating a Dynamic Body

지금까지 그라운드 바디를 생성한는 방법을 알았다. 이 방법(테크닉)을 이용해서 다이나믹 바디를 
만들어 보겟다. 그라운드 바디와 다이나믹 바디의 차이점이 있는데 가장 큰 차이점은
다이나믹 바디의 mass 속성을 지정해주어야 한다. 

첫번째로 CreateBody 를 이용해서 body 를 만든다. 디폴트 바디는 static 이기 때문에 
b2BodyType를  다이나믹 바디 오브젝트를 만들때 준비해야 한다. 

b2BodyDef bodyDef;

bodyDef.type = b2_dynamicBody;

bodyDef.position.Set(0.0f, 4.0f);

b2Body* body = world.CreateBody(&bodyDef);

주의 :   body type 을 b2_dynamicBody 으로 설정해한다. 사용자의 입력에 따른 반을을 할려면 말이다. 



다음으로 fixture 정의 를 이용해서 폴리곤 shape를 생성하고 할당한다. 
첫번재로 boxshape를 생성하고 

b2PolygonShape dynamicBox;

dynamicBox.SetAsBox(1.0f, 1.0f);


다은으로 box를 이용해서 fixture정의를 생성한다. 밀도 density는 1로 정해준다.
디폴트 밀도는 0 이다 shape의 마찰(friction)은 0.3으로 하자. 

b2FixtureDef fixtureDef;

fixtureDef.shape = &dynamicBox;

fixtureDef.density = 1.0f;

fixtureDef.friction = 0.3f;



픽스쳐의 정의를 이용하면  fixture를 생성할수 있다. 이것은 body의 mass를 자동으로 업데이트 해준다.  이것으로 많은 fixture를 원하는 body에 추가 할수 있다. 
각각의 요소는 전체 mass를 구성하는 역활은 한다. 



2.4 simulating the world (of Box2D)
지금까지 그라운드 박스를 만들고 다이나믹 박스도 만들어 보았다.
이제 거의 모든 준비는 다되었습니다. 
이제 몇가지만 고려하면 됩니다. 

Box2D 적분기(integrator)라는 컴퓨팅 알고리즘을 이용합니다. 
인터그래이터(알고리즘)는 물리공식을 이산시간에 대해서 시뮬레이션합니다. 
이산시간이란 ( 시간을 연속적으로 보지않고 일정한 간격으로 잘라 사용하는것을
의미합니다.) 전통적인 게임루프(플립북에서 대상이 움직이는 하나의 scene)와 같이 
진행이 된다. 그래서 Box2d를 위한 시간이 필요하다.  일반적으로 게임에서 물리엔진은 
60프레임정도이다. 이 프레임 보다 더 크게 시간을 분할할 필요는 없다. 그러나 생성한
world 오브젝트에 대한 정의를 주의깊게 준비해야 한다. 
다양한 time step은 다양한 결과를 야기 시킨다. 이것은 디버깅 하기도 어렵다 .
그러므로 진행하는 프레임에 time step을 엮지 말라. (진정으로 정말 원한다 하더라도
말이다. )
별다른 고생할 필요없이 여기 간단하게 time step을 설정할수 있다. 

float32 timeStep = 1.0f / 60.0f;


게다가 적분기에 , Box2d는 constraint solver 라고 불리는 코드의 더 많은 비트를
이용할수 있다. constraint solver은 시뮬레이션 제약에 대해서 해결책을 제공해준다. 
하나의 제한은 완전하게 해결할수 있다. 그러나 하나의 제한을 해결할때 또다른 
제한을 약간 방해 한다. 좋은  해결책은 모든 제한에 대해서 여러번 반복할 필요있습니다.

constraint solver 에 2개의 단계가 있다. : 속도 단계 위치 단계
속도 단계에서 solver 바디를 정확하게 움직이기 위해서는 필수적으로 impulses를 연산
할 필요가 있다. 위치 단계에서는 solver는 overlap 과 조인트 분리를 오차를 줄이기 위해서 
바디의 포지션을 조정한다. 각각의 단계는 자기자신의 iteration count 를 가지고 있다 
만약 에러가 작다면 위치 단계는 반복을 일찍 벗어난다.

box2d에서 추천하는 iteration은 속도 8이고 위치3 이다. 이 숫자는 임의로 조정할수 있다.
명심할것은 속도와 정확도는 trade-off 이다. 적은 숫자의 iteration은 속도를 증가 시키지만.
정호가도는 개판이다. 반대로  많은 iteration은 속도를 줄이지만 시뮬레이션의 정확도는 좋다
간단한 예제에서 많은 iteration은 필요없다. 
여기에 우리가 선택한 iteration counts가 있다. 

int32 velocityIterations = 6;

int32 positionIterations = 2;


time step 과 iteration counts은 아무 상관이 없다. iteration은 sub-step 이 아니다. 
하나의 solver iteration 은 time step내의 모든 constraints(제약조건)을 한번씩은 통과해야 한다
(확인해야 한다.)최소한 한번이다. 이말은 여러번 반복할수 있다라는 말이다. 

우리는 시뮬레이션 루프시작을 준비한다. 당신의 게임에서 시뮬레이션루프는 게임루프에 
통합된다.당신의 게임루프전체의 각각의 단계에서 당신은 b2World::step를 호출할수 있다.
일반적으로 당신의 프레임과 물리 time step 에 따라  다릅니다.

Hello World 프로그램은 심플하게 디자인(구성)되어 있다. 그래서 
그래픽적 아웃풋은 없다. 코드는 다이나믹바디의 위치와 회전값을 출력한다. 
여기에 시뮬레이션 루프가 있다. 이는 시뮬레이션 타임의 1초에서 60번의 time step을 
시뮬레이션한다.

for (int32 i = 0; i < 60; ++i)

{

    world.Step(timeStep, velocityIterations, positionIterations);

    b2Vec2 position = body->GetPosition();

    float32 angle = body->GetAngle();

    printf("%4.2f %4.2f %4.2f\n", position.x, position.y, angle);

}


출력되는 데이터는 박스의 떨어짐과 그라운드 박스에 안착하는 것을 보여준다.
아마도 당신이 볼수 있는 데이터는 

0.00 4.00 0.00

0.00 3.99 0.00

0.00 3.98 0.00

...

0.00 1.25 0.00

0.00 1.13 0.00

0.00 1.01 0.00


이럴것이다.


2.5 Cleanup
world 가 범위를 벗어나거나 pointer에 삭제가 호출될때 bodies,fixtures,joints에 남겨놓은
모든 메모리는 해제된다. 이것은 퍼포먼스를 향상시키고 당신의 삶을 좀더 쉽게 해주기위해서
이다.

그러나 당신이 가지고 있는 bodies,fixtures,joints의 포인터를 해제할 필요가 있을것이다.
그것들은 필요가 없어 질것이기 때문이다. 


2.6 The Testbed 
HelloWorld 예제를 정복하기 위해서는 Box2d의 testbed를 보아야 할것이다. 
testbed는 프레임워크와 메모환경을 unit 단위로 테스트 할수 있다. 
여기에 몇가지 특징이 있다. 

• Camera with pan and zoom.

• Mouse picking of shapes attached to dynamic bodies.

• Extensible set of tests.

• GUI for selecting tests, parameter tuning, and debug drawing options.

• Pause and single step simulation.

• Text rendering.



testbed 는 box2d 사용에 대한 많은 예제를 가지고 있다. 많이 고치고 찾아보아라.

testbed는 freeglut와 GLUI를 사용해서 작성되었다. testbed는 box2d 라이브러리의 일부분이
아니다. box2d 라이브러리는 렌더링에 대해서 문외한이다.? 예제에 보여지는 것은 box2d를
사용하여 렌더링할수 없다 ?

 



























Posted by 수다쟁이증후군 :
(들어가면서 :

1. 한글화 목적 : jbox2d 를 위한 기초작업
                     작성자 : 나
                     번역 태클 : 원추!!!!!!  강추!!!!!!

2. 출처 http://box2d.org/manual.pdf


제 1장 개요

1.1 box2d란 
box2d 란 게임을 위한 강체 시뮬레이션 라이브러리 이다. 
프로그래머는 게임을 이용하는 사람들이 어떠한 물체를 이동시킬수 있게 하고 좀 더 반응성이
좋은 게임을 만들기 위해 이 엔진을 사용한다.
게임 엔진의 관점에서 물리엔진은 단지 에니메이션을 처리하는 시스템일 뿐이다. 

Box2d 는 포터블C++로 작성 되었다 . 이 엔진에서 대부분의 타입은 b2라는 접두어가 붙어 있다 
이건 게임엔진을 사용하면서 네이밍하는데 있어서 중복을 피할수 있게 도움을 줄것이다. 

1.2 Box2D 를 사용하기에 앞서 
이 메뉴뉴얼은 당신이 기본 물리개념(mass, force, torque impulses...)을 좀더 친숙하게 해줄
수 있지만. 이게 전부 가 아니다. 구글링이나 위키를 이용하기 바란다. 

Box2d는 게임 개발자 컨퍼런스에서 물리강좌의 한부분으로 만들어졌다.  box2로 만든 이강좌는 
홈페이지에서 다운받을수 있다. 

Box2D가 C++로 작성되었기때문에 c++ 프로그래밍 경험은 당연히 있어야 한다. 
Box2D가 C++ 입문으로써는 적합하지 않다. 최소한 컴파일과 링크와 디버깅은 능숙하게 
다루어야 한다. 

1.3 이 메뉴얼에 관해서 
이 메뉴얼은  배부분의 Box2d API를 다루고 있다 글그러나 그게 전부는 아니다.
좀더 공부하고자 한다면 Box2D를 포함하는 Testbed를 충분히 보기 바란다 . 또한.
Box2D 코드는 Doxygen 으로 되어있다 그래서 api문서를 만들기는 좋을 것이다.

이문서는 새로운 버전에 맞추어져 있을며 최신 버전이다.

1.4 피드백과 버그리포팅
Box2D관련 질문이 있다면  포럼에 글을 남기세요. 매우 많은 사람들이 사용하니까
토론장소로 최고다.
Box2D관련 이슈는 구글코드프로젝트를 이용된다.  이건 이슈를 추적하기 좋고 포럼속에
묻히는걸 방지해준다 . ㅋ
여기에 있다 : http://code.google.com/p/box2d/

 
1.5 중요컨셉

Box2D 는 몇가지 몇 가지 중요 objects 가 있다. 여기에서는 간단히 정리하고 
자세한 내용은 관련 챕터에서 알아 본다. 

shape
.원이나 폴리곤 같은 2차원 기하객체이다. 

rigid body

물체(body)를 구성하는 두 입자의 거리가 절대로 바뀌지 않을 때 그러한 물체를 강체라고 한다.

다이아몬드처럼 단단한 물체이다.

물리현상에서 실제로 존재하지 않지만 단순화된 물리 법칙을 구현하기 위해 가정하는 형태이다.

일반적으로 생각할 때 단단한 고체 정도로 생각하면 될 것 같다.
(해석이 잘안되서 차용함 : 출처 : http://cafe.naver.com/uiaa.cafe)

fixture
fixture(고정장치) 는 body에 shape를 연결한다. 밀도 마찰 반발력과 같은 물체속성을 추가한다. 

constraint
constraint는 물체의 자유도를 없는 물리적연결이다. 
2차원에서 body는 자유도 3을 가진다.(2개의 이동축과 1개위 회전축)만약 body를
벽에 고정한다면 이것 벽에 body를 constraint한것이다.  그 고정점을 기분으로  body는
회전할수 있다. 그래서 constraint는 자유도 2를 제거한다.

constact constraint 
special constraint 는 강체의 침투(강체가 부딧쳤을때 움푹파이는 정도)를 막기 위해 만들어졌다 
또한 마찰 과 반발력을 시뮬레이션 할수 있게한다. 직접 만들수 없고. Box2D가 자동으로
생성한다.


joint
2가지 이상의 body를 하나로 만들어주는 constraint 이다. Box2d는  revolute, prismatic, distance... 과 같은 joint 타입을 제공한다. 몇가지 joint는 제약을 가진다. 


joint limit
joint limit 는 조인트의 움직이는 범위를 제한한다. 에를 들러 사람의 팔꿈치는 일정한 번위만큼만 
회전한다. 


joint motor
조인트 모터는 조인트의 허용되는 각도에 따라 연결된 바디의 움직임을 유발한다.
예를 들면 모터를 팔굼치를 회전 시키기 위해 사용할수 있다.

world
프로그래밍상의 물리공간이다.Box2D는  복수의 물리공간을 만들수 있으나 
별로 추천하지는 않는다 . 

solver
물리공간은 solver를 가진다. 이놈은 좀더 나은 타이머를 사용할수 있게 해주며
접촉과 joint제약을 해결해준다. Box2d에서 이놈은 성능이 좋다 

continuous collision
solver는 물체는 점진적으로 이동시킨다. 별도의 상호작용없이 turnneling
을 이끌어준다. 
Box2D는 turnneling을 위해 특별한 알고리즘을 사용한다. 
첫번째로 충돌 알고리즘 은 첫번째 impace를 찾기위해 2개의 바디의 움직임을 보간한다.
(아  힘드네 이거 생각보다 )

일단 요까이 ~~ ㄷㄷㄷ
2011/09/29

1.6 모듈
Box2d 는 3가지 모듈(Common, Collision,Dynamics)로 구성된다. 
Common 모듈은 allocation,math,settings과 관련된 코드를 가진다. 
Collision 모듈은 shapes,broad-phase, collision function/queries 를 정의한다. 
마지막으로 
Dynamics 모듈은 simulation world,bodies,fixture,joints 를 제공한다. 




1.7 단위(Units)
Box2d는 부동소수전연산을 하고 허용오차는 Box2d가 좀 더 동작을 잘하도록 도와준다. 
이러한 허용오차는 미터, 킬로그램,초 단위와도 잘 작동하도록 조정되었다.
특별히 Box2d는 0.1미터와 10미터 사이에서 잘동작되도록 조정 되어있습니다.
즉 이말은  0.1과 10 사이에서  soup cans와 buese 사이의 물체는 작동이 잘됩니다.(이말이
먼말인지 모르겟네) 정적 물체는 50미터 까지는 큰 문제 없을 겁니다.

2D 물리 엔진 이기 때문에 사용자가 이용하는 화면의 픽셀단위로 변경 하고 싶어 질겁니다.
불행히도 이것은 시뮬레이션 결과가 부정확해질겁니다.  200픽셀 길이의 물체가 Box2D 에서는 
45층 건물정도의 크기 입니다. (단위를 조심할것.)
**주의 **
**Box2d는 MKS 단위입니다.물체는 대략적으로 0.1에서 10미터 를 움직이는 것으로 유지해라.
**화면에 무언가를 렌더링 할 때 아마도 단위변환 시스템이 필요할것입니다.  Box2d testbed는
**opengl viewport 변형을 이용한다. 픽셀 단위를 사용하지 마세요. 

이미지를 붙이는 하나의 판처럼  box2d 바디를 생각하는 가장 좋습니다. 미터단위로 그 판을 움직
일수 있습니다. 그 반면에 간단한 요소를 이용하여 픽셀 좌표로도 변형 할수 있다. 
이는 스프라이트 같은 요소를 움직이기 위해 픽셀좌표를 이용할수 있습니다. 

box2d는 각도를 위해 라디안을 이용합니다. 바디의 회전은 라디안으로 값을 저장하고 증가 또는 
축소 할 수 있습니다. 각도의 크기가 너무 크다면 바디의 회전을 정규화 해야 합니다. 


1.8 Factories 와 Definetions
메모리 관리는 box2d api 에 있어서 중요한 역활은 합니다.  그래서 
b2body 나 b2joint 의 객체를 만든다면 b2world 의 팩토리 함수를 호출할 필요가 있습니다. 
다른방법으로 이런것들을(바디 조인트....)을 할당할 필요없습니다.

생성함수는 와 같습니다. 
b2Body* b2World::CreateBody(const b2BodyDef* def)
b2Joint* b2World::CreateJoint(const b2JointDef* def)
 
그리고 이와 반대의 메모리 해제는 아래와 같습니다.
void b2World::DestroyBody(b2Body* body)
void b2World::DestroyJoint(b2Joint* joint)

바디와 조인트를 만들때 definution을 필요로 한다.  그 definitions에는 바디와 조인트를 만드는데
필요한 정보들이 포함되어 있어야 한다.
이러한 접근법은
객체생성에서 에러를 줄일수 있고,
파라미터의 수를 줄일수 있고,
알맞은 정의를 제공할수 있고,
접근자의 수도 줄일수 있다.

fixtures 는 바디를 부모로 해야 하기때문에 b2Body의 팩토리 메소드를 이용해서 생성하도 해제 한다. 
b2Fixture* b2Body::CreateFixture(const b2FixtureDef* def)
void b2Body::DestroyFixture(b2Fixture* fixture)

shape와 density로 부터 바로 fixture를 생성하는 방법이 있습니다. 
b2Fixture* b2Body::CreateFixture(const b2Shape* shape, float32 density)

팩토리는 정의에 대한 참조를 유지하지 않는다. 그렇기 때문에 stack에 대한 정의를 만들어야 한고 임시 resources에 유지 해야 한다. 



1.9 유저 데이터 
b2Fixture 와 b2Body 그리고 b2Joint 클래스들은 void 포인트로서 user data에 접근해야 한다.
이것은
Box2D 자료 구조를 검토(?)할 때
게임엔진에서 엔티티에  어떻게 관계 지어야 할지를 결정할때 
유용합니다

예를 들면 강체에 actor 포인터를 붙이것이 일반적이다 . 이것은 연산 레퍼런스를 준비해야 한다.
만약 actor를 가지고 있다면 body획득할수 있다. 반대로 바디를 가지고 있다면 actor를 얻을수 있다. 
GameActor* actor = GameCreateActor();
b2BodyDef bodyDef;
bodyDef.userData = actor;
actor->body = box2Dworld->CreateBody(&bodyDef);

유저 데이터가 필요한 case가  몇가지 있다.
*충돌 결과를 이용하는 actor에 데미지(?)를 적용 할 때.
*플레이어가 축-정렬(axis-aligned) 박스안에 있다면 scripted event를 동작 시킬때
*조인트가 파괴 될것을 Box2d가 우리에게 알려줄때 겜임 구조에 접근.

유저 데이터는 하나의 옵션이고 어디에든지 위치 시킬수 있다라는 것을  명심해야 한다. 
그럼에도 불구하고 개발자는 항상 일관되어야 합니다(?) 예를 들어 
actor 포인트를 바디에 저장한다면  actor 포인트를 전체바디에 유지 해야한다.
하나의 바디에 actor 포인터나 첫번째 포인터를 다른 bosy에 저장하지 말것. 
첫번째 포인터를 actor 포인터로 캐스팅하는 것은 충돌을 일을킬수 있다. 

유저 데이터는 기본적으로 NULL 이다. 




Box2d를 이해하고 메뉴얼을 해석하는 것이 아니기 때문에 
번역상의 이상한점이아 오류들이 많을수 있습니다. 지적 해주시면 감사 하겟습니다.



 




































 
Posted by 수다쟁이증후군 :
1.JBox2d 란
==> Box2d를 자바환경에 변형한것이다. 

2.관련 문서들

box2d 매뉴얼
http://www.box2d.org/manual.pdf

한글화 작업 및 관련 강좌는 아래의 싸이트에 정리 잘되어있습니다. 
http://cafe.naver.com/uiaa.cafe

jbox2d 공식사이트
http://www.jbox2d.org

구글 코드 싸이트
http://code.google.com/p/jbox2d/

 
Posted by 수다쟁이증후군 :