반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

Physics Bodies

2011. 9. 27. 05:15 | Posted by 솔웅


반응형
object 에 물리 엔진을 적용하려면 addBody를 해 줘야 합니다.
그러면 그 적용된 객체는 코로나에서 제공하는 물리엔진의 적용을 받게 됩니다.
코로나에서는 box2D라는 물리엔진을 사용하고 있구요.

addBody에는 다음과 같이 3개의 프로퍼티들을 가지고 있습니다.

density : 사전에 보면 밀도라고 나옵니다. 코로나에서는 물의 density를 1.0으로 하고 있습니다. 그러므로 나무처럼 물에 뜨는 일반 물질들은 그 이하의값들을 넣어야 겠죠? 쇠 같이 물에 가라앉는 것들은 1.0보다 커야 하겠구요. 이 값은 gravity (중력)과 pixels to meter scale setting 과도 관계가 있습니다. 이러한 값들을 다양하게 바꿔가면서 테스트 해야 친숙해 질 것 같습니다. 디폴트는 1.0 입니다.

friction : 마찰입니다. 디폴트는 0.3 입니다. 0.0은 아무런 마찰력이 없는 것이고 1.0은 강한 마찰력이 있는 것입니다.

bounce : bounce 는 box2D 에서는 내부적으로 restitution 로 알려져 있다고 합니다. 객체끼리 충돌(collision) 하고 난 후 속도의 변화를 얼마나 줄 지에 대한 값입니다. 점점 줄어들면 공이 튀다가 땅에 멈춰 서듯이 설것이고 하나도 줄어들지 않으면 (1.0) 벽돌깨기의 공처럼 계속 튈 겁니다. 디폴트는 0.2 입니다. 그리고 1.0 보다 큰 값도 넣을 수 있습니다.

addBody는 아래와 같이 사용합니다.
local crate = display.newImage( "crate.png", 100, 200 )
physics.addBody( crate, { density = 1.0, friction = 0.3, bounce = 0.2 } )

이렇게 되면 crate.png 이미지 파일에 physics가 적용됩니다.
물론 이것은 전체 이미지 크기인 사각형으로 적용됩니다. 이미지 파일 안의 특정한 이미지(병, 바퀴 같은) 에 적용되는게 아닙니다.

addBody의 프로퍼티들을 한번 지정한 후 이를 많은 객체들에 적용할 수도 있습니다.

local crate1 = display.newImage( "crate.png", 100, 200 )
local crate2 = display.newImage( "crate.png", 180, 280 )
 
local crateMaterial = { density = 1.0, friction = 0.3, bounce = 0.2 }
 
physics.addBody( crate1, crateMaterial )
physics.addBody( crate2, crateMaterial )

사각형이 아닌 원형으로 addBody를 하고 싶으면 반지름 파라미터를 하나 더 넣으면 됩니다.

local ball = display.newImage( "ball.png", 100, 200 )
physics.addBody( ball, { density = 1.0, friction = 0.3, bounce = 0.2, radius = 25 } )

이러면 반지름 25인 원형으로 addBody가 적용 됩니다.
적용된 부분을 확인 하려면 physics.setDrawMode( "hybrid" ) 를 사용하시면 됩니다.

그러면 다각형은 어떻게 할까요?


local triangle = display.newImage("triangle.png")
triangle.x = 200
triangle.y = 150
triangleShape = { 0,-35, 37,30, -37,30 }
 
physics.addBody( triangle, { density=1.6, friction=0.5, bounce=0.2, shape=triangleShape } )
 
------
 
local pentagon = display.newImage("pentagon.png")
pentagon.x = 200
pentagon.y = 50
pentagonShape = { 0,-37, 37,-10, 23,34, -23,34, -37,-10 }
 
physics.addBody( pentagon, { density=3.0, friction=0.8, bounce=0.3, shape=pentagonShape } )

위 경우는 3각형이고 아래 경우는 5각형입니다.
순서대로 각 꼭지점의 x,y 좌표를 구하신 후 이것을 shape 파라미터에 넣어주시면 됩니다.

bodyType 은 3종류가 있습니다.
physics.addBody( triangle, "static", { density=1.6, friction=0.5, bounce=0.2, shape=triangleShape } )

위 경우는 static 으로 설정 돼 있습니다. 이 외에 dynamic 과 kinematic 이 있습니다.

다음 예제를 보시죠.

local car = display.newImage("big_red_car.png")
roofShape = { -20,-10, 20,-10, 20,10, -20,10 }
hoodShape = { 0,-35, 37,30, -37,30 }
trunkShape = { 0,-37, 37,-10, 23,34, -23,34, -37,-10 }
 
physics.addBody( car, "dynamic",
  { density=3.0, friction=0.5, bounce=0.2, shape=roofShape },
  { density=6.0, friction=0.6, bounce=0.4, shape=hoodShape },
  { density=4.0, friction=0.5, bounce=0.4, shape=trunkShape }
)

만약에 자동차에 addBody를 할 때 지붕, 후드, 몸체 부분을 별도의 파트로 나눠서 정교하게 나눠 addBody를 할 수 있습니다.

이런 경우 쉽게 복잡한 이미지의 좌표값들을 찾아주는 툴이 있는데요.
http://www.physicseditor.de
위 싸이트로 가시면 Physics Editor를 다운 받으실 수 있습니다.
사용법을 보시려면 아래 유튜브를 참조하세요.

http://youtu.be/xKeYg1ViQJE


이번 시간에는 addBody에 대한 공부와 physics Editor 소개를 해 드렸는데요.

다음 시간엔 직접 코딩 해 가면서 보여드리려고 합니다.
적당한 예제를 찾으려고 하는데... 복잡한 것만 있어서...
코로나 샘플 중에는 당구게임이 좋던데.. 좀 복잡하네요.

한번 찾아보고 당구게임이나 너무 복잡하면 직접 코딩하면서 하던가 할께요.

다음 시간에 뵈요.
반응형