어제는 박스2D 물리 엔진을 가지고 아이폰에서 물리 시뮬레이션을 할 수 있는 방법에 대한 기초 과정을 스터디 해봤습니다. 다음주에는 이 것을 응용해서 자신만의 창의적인 생각을 담은 물리 시뮬레이션을 만들어 오기로 했어요. 아직 완벽하게 소화하지 못해 정확한 설명을 하긴 무리이긴 하지만 물리엔진에 대해 짧막하게 설명하자면 물리적인 특성을 적용할 수 있는 가상의 세계를 만들고 그 안에서 물리 객체들을 시뮬레이션 할 수 있도록 해주는 엔진입니다. 가상 세계에서 시뮬레이션한 데이터들을 주기적으로 현실(화면)에 반영하면 우리가 적용하고자 하는 물리적인 현상을 화면에서 확인할 수 있습니다. 아래 동영상은 아이폰SDK와 Cocos2D API를 설치한 상태에서 Box2D 템플릿 프로젝트를 선택하고 템플릿에 기본적으로 구현된 4가지 모양의 박스를 터치해서 랜덤하게 떨어뜨리는 과정이며 간단한 코드를 추가해서 떨어지는 중력의 방향을 화면 중앙을 기준으로 터치한 위치로 변화시켜보는 내용입니다. 누구나 따라해 볼 수 있으나 제대로 응용을 하려면 Box2D 홈페이지에서 관련 문서를 확인해보셔야 겠습니다.
// 중앙을 기준으로 터치한 위치로 중력 방향 변경하기
- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
CGSize screenSize = [CCDirector sharedDirector].winSize;
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView: [touch view]];
location = [[CCDirector sharedDirector] convertToGL: location];
float accelX = (float) (location.x - screenSize.width / 2);
float accelY = (float) (location.y - screenSize.height / 2);
float length = sqrtf((accelX * accelX) + (accelY * accelY));
b2Vec2 gravity( accelX * 10 / length, accelY * 10 / length);
world->SetGravity( gravity );
}
// 원형 물체를 월드에 등록하기
{
CCSprite *ball = [CCSprite spriteWithFile:@"circle32.png"];
ball.position = ccp(5 * PTM_RATIO, 5 * PTM_RATIO);
[self addChild:ball];
b2BodyDef bd;
bd.position.Set(5.0f, 5.0f);
bd.type = b2_dynamicBody;
bd.fixedRotation = true;
bd.allowSleep = false;
bd.userData = ball;
b2Body *body = world->CreateBody(&bd);
b2CircleShape shape;
shape.m_radius = 32.0f / PTM_RATIO / 2.0f;
b2FixtureDef fd;
fd.shape = &shape;
fd.density = 20.0f;
body->CreateFixture(&fd);
}
// 6각형 물체를 월드에 등록하기
{
CCSprite *polygon = [CCSprite spriteWithFile:@"polygon.png"];
polygon.position = ccp(5 * PTM_RATIO, 5 * PTM_RATIO);
[self addChild:polygon];
b2BodyDef bd;
bd.position.Set(5.0f, 5.0f);
bd.type = b2_dynamicBody;
bd.fixedRotation = true;
bd.allowSleep = false;
bd.userData = polygon;
b2Body* body = world->CreateBody(&bd);
float32 angle = 0.0f;
float32 delta = b2_pi / 3.0f;
b2Vec2 vertices[6];
for (int32 i = 0; i < 6; ++i) {
vertices[i].Set(0.5f * cosf(angle), 0.5f * sinf(angle));
angle += delta;
}
b2PolygonShape shape;
shape.Set(vertices, 6);
b2FixtureDef fd;
fd.shape = &shape;
fd.density = 20.0f;
body->CreateFixture(&fd);
}
// 긴 사각형과 그라운드 바디 사이에 조인트 생성하기
{
b2PolygonShape shape;
shape.SetAsBox(2.0f, 0.5f);
b2BodyDef bd;
bd.type = b2_dynamicBody;
bd.position.Set(5.0f, 5.0f);
bd.angle = 0.5f * b2_pi;
bd.allowSleep = false;
b2Body* body = world->CreateBody(&bd);
body->CreateFixture(&shape, 5.0f);
b2PrismaticJointDef pjd;
// Bouncy limit
b2Vec2 axis(0.3f, 0.1f);
axis.Normalize();
pjd.Initialize(groundBody, body, b2Vec2(0.0f, 0.0f), axis);
// Non-bouncy limit
//pjd.Initialize(ground, body, b2Vec2(-10.0f, 10.0f), b2Vec2(1.0f, 0.0f));
pjd.motorSpeed = 5.0f;
pjd.maxMotorForce = 10000.0f;
pjd.enableMotor = true;
pjd.lowerTranslation = 0.0f;
pjd.upperTranslation = 8.0f;
pjd.enableLimit = true;
b2PrismaticJoint* m_joint;
m_joint = (b2PrismaticJoint*)world->CreateJoint(&pjd);
}
웹프로그래머의 홈페이지 정보 블로그 http://hompy.info/606
[연관 포스트]
아이폰 게임 제작을 위한 2D 그래픽 엔진 Cocos2D 설치 및 실행 동영상
아이폰 아이팟 코코아 터치 애플리케이션 개발 샘플 동영상
직장인을 위한 아이폰 게임 디자인 스터디를 추진해 봅니다.
직장인을 위한 아이폰 앱 개발 Cocos2D 스터디를 추진합니다.
[아이폰 스터디 그룹 맴버쉽 게시판]
http://flashcafe.org/iphone_study
// 중앙을 기준으로 터치한 위치로 중력 방향 변경하기
- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
CGSize screenSize = [CCDirector sharedDirector].winSize;
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView: [touch view]];
location = [[CCDirector sharedDirector] convertToGL: location];
float accelX = (float) (location.x - screenSize.width / 2);
float accelY = (float) (location.y - screenSize.height / 2);
float length = sqrtf((accelX * accelX) + (accelY * accelY));
b2Vec2 gravity( accelX * 10 / length, accelY * 10 / length);
world->SetGravity( gravity );
}
// 원형 물체를 월드에 등록하기
{
CCSprite *ball = [CCSprite spriteWithFile:@"circle32.png"];
ball.position = ccp(5 * PTM_RATIO, 5 * PTM_RATIO);
[self addChild:ball];
b2BodyDef bd;
bd.position.Set(5.0f, 5.0f);
bd.type = b2_dynamicBody;
bd.fixedRotation = true;
bd.allowSleep = false;
bd.userData = ball;
b2Body *body = world->CreateBody(&bd);
b2CircleShape shape;
shape.m_radius = 32.0f / PTM_RATIO / 2.0f;
b2FixtureDef fd;
fd.shape = &shape;
fd.density = 20.0f;
body->CreateFixture(&fd);
}
// 6각형 물체를 월드에 등록하기
{
CCSprite *polygon = [CCSprite spriteWithFile:@"polygon.png"];
polygon.position = ccp(5 * PTM_RATIO, 5 * PTM_RATIO);
[self addChild:polygon];
b2BodyDef bd;
bd.position.Set(5.0f, 5.0f);
bd.type = b2_dynamicBody;
bd.fixedRotation = true;
bd.allowSleep = false;
bd.userData = polygon;
b2Body* body = world->CreateBody(&bd);
float32 angle = 0.0f;
float32 delta = b2_pi / 3.0f;
b2Vec2 vertices[6];
for (int32 i = 0; i < 6; ++i) {
vertices[i].Set(0.5f * cosf(angle), 0.5f * sinf(angle));
angle += delta;
}
b2PolygonShape shape;
shape.Set(vertices, 6);
b2FixtureDef fd;
fd.shape = &shape;
fd.density = 20.0f;
body->CreateFixture(&fd);
}
// 긴 사각형과 그라운드 바디 사이에 조인트 생성하기
{
b2PolygonShape shape;
shape.SetAsBox(2.0f, 0.5f);
b2BodyDef bd;
bd.type = b2_dynamicBody;
bd.position.Set(5.0f, 5.0f);
bd.angle = 0.5f * b2_pi;
bd.allowSleep = false;
b2Body* body = world->CreateBody(&bd);
body->CreateFixture(&shape, 5.0f);
b2PrismaticJointDef pjd;
// Bouncy limit
b2Vec2 axis(0.3f, 0.1f);
axis.Normalize();
pjd.Initialize(groundBody, body, b2Vec2(0.0f, 0.0f), axis);
// Non-bouncy limit
//pjd.Initialize(ground, body, b2Vec2(-10.0f, 10.0f), b2Vec2(1.0f, 0.0f));
pjd.motorSpeed = 5.0f;
pjd.maxMotorForce = 10000.0f;
pjd.enableMotor = true;
pjd.lowerTranslation = 0.0f;
pjd.upperTranslation = 8.0f;
pjd.enableLimit = true;
b2PrismaticJoint* m_joint;
m_joint = (b2PrismaticJoint*)world->CreateJoint(&pjd);
}
웹프로그래머의 홈페이지 정보 블로그 http://hompy.info/606
[연관 포스트]
아이폰 게임 제작을 위한 2D 그래픽 엔진 Cocos2D 설치 및 실행 동영상
아이폰 아이팟 코코아 터치 애플리케이션 개발 샘플 동영상
직장인을 위한 아이폰 게임 디자인 스터디를 추진해 봅니다.
직장인을 위한 아이폰 앱 개발 Cocos2D 스터디를 추진합니다.
[아이폰 스터디 그룹 맴버쉽 게시판]
http://flashcafe.org/iphone_study


댓글을 달아 주세요
저기 원에서 32.0f / PTM_RATIO / 2.0f를 하는 이유좀 설명해주시면 고맙겠습니다
음.. Box2D 엔진은 플래시에나 쓰이는 줄 알았는데 아이폰에도 이용되네요 ㅇㅅㅇ