(들어가면서 :

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 수다쟁이증후군 :