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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

Physics Joint

2011. 9. 28. 22:53 | Posted by 솔웅


반응형
오늘은 Physics의 Joint 라는 개념에 대해 알아보겠습니다.
조인트는 여러 객체를 연결시키는 겁니다. 예를 들어 인형의 머리 몸통 팔 다리 이미지가 있을 때 이 이미지들을 joint로 연결해서 자연스럽게 움직이게 할 수 있습니다.
코로나 샘플을 보면 Bridge나 Chains에서 이 기술을 썼습니다.
























































보시면 다리를 구성하는 나무조각과 체인을 구성하는 각각의 체인들이 이 조인트로 연결 된 겁니다.
Joint를 사용하시려면 우선 객체를 만들어서 addBody를 하신 후에 그 객체에 Joint를 선언하시면 됩니다.

Joint 의 종류에는 총 8가지가 있습니다.
이 8가지에 대해 하나하나씩 알아가 보도록 하겠습니다.

오늘은 간략하게 각 조인트들을 적용해서 실행해 볼께요.
아래 코드를 가지고 여러 조인트들을 적용해 보겠습니다.
이 코드는 지난번에 충돌(Collision) 인가에서 썼던 코드일 겁니다.

local physics = require "physics"
physics.start()
system.activate( "multitouch" )
physics.setDrawMode( "hybrid" )

local ground = display.newImage( "ground.png" )
ground.x = display.contentWidth / 2
ground.y = 445
ground.myName = "ground"

physics.addBody( ground, "static", { friction=0.5, bounce=0.3 } )

local crate1 = display.newImage( "crate.png", 20, 70 )
physics.addBody( crate1, { density=3.0, friction=0.5, bounce=0.3 } )
crate1.myName = "first crate"
crate1.setGravity = 2
 
local crate2 = display.newImage( "crate.png", 100, 120 )
physics.addBody( crate2, { density=3.0, friction=0.5, bounce=0.3 } )
crate2.myName = "second crate"

-- A general function for dragging physics bodies
local function dragBody( event )
        local body = event.target
        local phase = event.phase
        local stage = display.getCurrentStage()
 
        if "began" == phase then
                stage:setFocus( body, event.id )
                body.isFocus = true
      -- Create a temporary touch joint and store it in the object for later reference
                body.tempJoint = physics.newJoint( "touch", body, event.x, event.y )
 
        elseif body.isFocus then
                if "moved" == phase then  
                        -- Update the joint to track the touch
                        body.tempJoint:setTarget( event.x, event.y )
                elseif "ended" == phase or "cancelled" == phase then
                        stage:setFocus( body, nil )
                        body.isFocus = false
                        -- Remove the joint when the touch ends                
                        body.tempJoint:removeSelf()
                end
        end
 
        -- Stop further propagation of touch event
        return true
end
 
-- Make object draggable
crate1:addEventListener( "touch", dragBody )
crate2:addEventListener( "touch", dragBody )

이미지는 아래 이미지들이 필요합니다.










잠깐 코드를 보면 처음에 physics를 import 해서 start 시켰구요.
멀티터치를 적용했네요. (이건 나중에 따로 살펴 볼 겁니다.)
그리고 draw mode는 hybrid로 해서 body가 적용된 사항을 볼 수가 있게 했구요.

그 다음에 ground.png를 그리고 여기에 static 으로 addBody를 했습니다.
다음은 crate.png로 두개의 객체를 만든 후 addBody를 했습니다.
dynamic이 디폴트니까 이게 적용 됐겠네요.

맨 밑에 보면 crate1, crate2에 touch에 반응하는 리스너를 달았고 touch 시 dragBody 함수를 불러오도록 했습니다.

dragBody에는 touch 조인트가 사용됐네요.
touch 해서 move 할 때는 touch 조인트가 적용되서 박스가 그럴듯 하게 움직일 겁니다. 그리고 touch 가 끝나면 조인트가 remove되서 박스는 떨어지겠네요.


이대로 실행해 보시구요.

시뮬레이터인 경우엔 마우스로 디바이스인 경우엔 손가락으로 박스를 옮겨 보세요.
그리고 막 돌려보시고 박스로 박스를 밀쳐보시고 한번 해 보세요.

그럼 Touch Joint 가 어떤식으로 적용 되는지 아실거예요.

Touch 조인트는 다른 조인트와 다르게 객체 하나에만 적용 됩니다.

그럼 이 소스를 기본으로 해서 다른 여러 joint들을 적용해 볼까요?

1. Pivot Joint
Pivot 은 중심, 축 이라는 뜻입니다. Box2D에서는 revolute Joint 라고 합니다.
코드 맨 밑에 아래 코드를 추가해 보세요.
myJoint = physics.newJoint( "pivot", crate1, crate2, 50,60 )

신택스는 아래와 같습니다.

physics.newJoint( jointType, object1, object2, anchorX, anchorY )

jointType은 "pivot"이고 object2, object2는 조인트 대상입니다.

anchorX-x 앵커 포인트, anchorY - y 앵커 포인트


실행해 보시고 박스를 막 움직여 보세요. 그러면 일정 거리만큼 객체들이 유지 될 거예요. 앵커 포인트가 객체 위치와 비교해서 어디로 설정 되느냐에 따라 두 객체의 연결 관계가 변합니다.


2. Distance Joint
pivot 조인트 부분을 주석처리하시고 아래 코드를 넣어보세요.
myJoint = physics.newJoint( "distance", crate1, crate2, crate1.x,crate1.y, crate2x,crate2.y )
Distance Joint는 두개의 객체 거리가 Fix돼 있게 만든 겁니다.

3. Piston Joint
피스톤 조인트는 아래 코드를 적용해 보세요.
myJoint = physics.newJoint( "piston", crate1, crate2, crate1.x,crate1.y, 50,80 )
이 조인트는 Box2D에서는 prismatic joint라고 불립니다.
이 조인트는 피스톤이나 자동차의 shock Observer같이 움직이는 조인트라고 합니다.
첫번째 객체의 앵커포인트를 기준으로 움직일 때 축을 기준으로 다른 객체가 움직입니다.
제 소스에서는 한 박스가 옆쪽으로 ground를 넘어서면 한 없이 떨어지고 다시 올리기가 힘든데요.
여러분은 상하좌우 wall을 만들고 이것에 addBody를 하셔서 한번 테스트 해 보시면 좋을 것 같네요.

4. Friction Joint
friction이 마찰, 저항이란 뜻인데요. pivot 조인트의 특별한 형태입니다.
움직일 때 약간 저항을 받는것 같네요. 코로나에서는 Sticky라고 표현했습니다.
myJoint = physics.newJoint( "friction", crate1, crate2, 10,30 )
위 코드로 테스트 해 봤는데... 전 정확히 어떤 특징이 있는지 모르겠네요.

5. Weld Joint
이 조인트는 확실히 알겠습니다.
Weld가 용접이란 뜻이니까 두 객체가 용접된 듯이 딱 붙어서 떨어지지 않는다는 얘기겠죠?
myJoint = physics.newJoint( "weld", crate1, crate2, 200,300 )
이렇게 하면 두 박스가 떨어져 있지만 용접한 것처럼 완전 고정돼 있습니다.
여러 객체를 붙일 때는 Weld 보다 여러 객체를 합한 body를 사용하는게 낫다고 코로나에서 그러네요.

6. Wheel Joint
Box2D에서는 line joint라고 합니다. piston과 pivot 조인트가 합쳐진 것이라고 하는데요. piston joint와 거의 같은데 다른 점은 축의 끝에서 로테이션이 가능하다고 합니다.
myJoint = physics.newJoint( "wheel", crate1, crate2, crate1.x,crate1.y, 50,80 )

7. Pulley Joint
myJoint = physics.newJoint( "pulley", crate1, crate2, 50,80, 200,120, crate1.x,crate1.y, crate2.x,crate2.y, 3.0 )
이 조인트를 사용했더니 두 박스가 대롱대롱 매달려있네요.
오른쪽 박스를 잡아 당기면 왼쪽 박스가 막 움직이구요.

8. Touch Joint
이 조인트는 이미 기본 소스에 적용 돼 있습니다.
Box2D에서는 mouse joint라고 한답니다. 객체가 마우스를 따라 다녀서 그런가요?

조인트를 없애려면 아래와 같이 합니다.
myJoint:removeSelf()

이렇게 Joint 까지 하고 나니 Box2D를 사용한 코로나의 Physics Engine에 대해 한번 다
훑어 봤습니다.

다음 토픽으로 넘어가기 전에 다음 시간엔 joint에 관한 샘플코드 몇가지를 살펴보고
넘어갈 까 합니다.

그럼 다음 시간에 뵐께요.



반응형

Physics Bodies 코딩 하기

2011. 9. 28. 02:16 | Posted by 솔웅


반응형
오늘은 지난 강좌때 했던 Physics Bodies 를 토대로 직접 코딩을 해 나가겠습니다.

우선 배경 그림부터 그려 넣을까요?


위 세가지를 이용할 겁니다.
일단 physics 엔진을 사용할거니까 아래 코드를 넣어 주세요.

local physics = require("physics")
physics.start()
physics.setDrawMode( "hybrid" )

setDrawMode는 physics.addBody 한 후에 확인하기 위해 hybrid롤 설정했습니다.
그 다음은 이번 코딩 내용과 크게 상관은 없지만 제가 항상 넣는 코드니까 일단 넣겠습니다.
display.setStatusBar( display.HiddenStatusBar )
_W = display.contentWidth;
_H = display.contentHeight;
첫번째는 아이폰의 Status Bar를 없애는 것이구요. 그 다음 두 줄은 스크린의 Width,Height를 변수에 담는 겁니다.
실제 앱을 만들다보면 이미지나 텍스트 배치 등에 이게 많이 쓰입니다.

그 다음은 배경 이미지들을 배치 하겠습니다.

local bkg = display.newImage( "bkg_cor.png" )
local grass = display.newImage("grass.png")
grass.x = 160; grass.y = 430
local grass2 = display.newImage("grass2.png")
grass2.x = 160; grass2.y = 440

여기까지 하면 아래와 같이 화면이 보입니다.


이제 grass에 addBody를 해 보죠.
physics.addBody( grass, "static", { friction=0.5, bounce=0.3 } )


아래 연두색으로 사각형이 표시돼 있죠?
이건 grass.png파일에 addBody를 해서 그래요. 저 위쪽에 setDrawMode를 hybrid로 설정했잖아요.

지금까지 사용한 이미지는 총 3가지 이고 이중 한가지(grass.png)에만 physics.addBody를 했습니다.
그리고 그 객체는 static으로 지정돼 있습니다.
이 객체는 움직이지 않을 겁니다. 그리고 다른 addBody가 적용된 움직이는 객체가 와서 부딪히면 physics엔진의 적용을 받을 겁니다.

이제 네모난 상자를 위에서 떨어뜨려 볼까요?

이 이미지를 사용합니다.
아래 두줄을 추가하세요.
local crate = display.newImage( "crate.png", 100, 50 )
physics.addBody( crate, { density = 1.0, friction = 0.3, bounce = 0.2 } )

그리고 실행해 보세요. 박스가 땅으로 떨어지죠? 그리고 땅 밑으로 더 이상 꺼지지 않구요.
이제 crate의 bounce를  0.8정도로 올려 보세요.


박스가 아주 탄력있게 튀어오르죠?
gravity를 바꾸고 grass의 bounce도 바꾸고 또 다른 density나 frictions 같은 값들을 바꾸면서 테스트 해 보면 이 값들이 하는 역할을 자세히 알 수 있을 거예요.

그리고 위에 보시는 대로 addBody 할 때 grass는 static으로 했습니다. 그리고 crate(박스) 는 지정하지 않았습니다. 디폴트는 dynamic이기 때문에 다이나믹으로 돼 있습니다.
hybrid를 적용 했을 때 static은 녹색으로 dynamic은 오렌지색으로 보입니다.

이젠  addBody를 사각형말고 원형으로 적용시켜 볼까요?

이 이미지를 다운 받고 rock.png로 네이밍 해 주세요.
local crate = display.newImage( "rock.png", 150, 20 )
physics.addBody( crate, { density = 1.0, friction = 0.3, bounce = 0.3, radius=30} )

바위는 bounce를 0.3으로 해 봤습니다.


전 박스와 바위 x,y좌표를 조금 바꿨는데.. 땅에 떨어지면서 서로 부딪혀서 옆으로 튕겨 나가네요. 박스는 통통 튀고 바위는 구릅니다.
하여간 보시다시피 바위는 radius=30을 적용해서 원형으로 addBody가 됐습니다.

이제 다각형을 해야 하나요?
이건 좌표값들을 일일이 계산하기가 힘들어서...
어제 강좌에 실었던 Physics Editor로 했는데 잘 안 되더라구요.
오늘 메일을 그 회사로 보내놓긴 했는데 언제 답이 올지는 모르겠습니다.

그냥 딱 맞지는 않지만 PhysicsEditor로 받아온 좌표값을 적용해서 한번 해 보겠습니다.

왼쪽 탁구채를 할겁니다. 이름은 endingblue.png 입니다.
이름이 조금 이상하지만.. 제가 얼마전에 만들었던 Multi Player Ping Pong 에서 사용했던 이미지 입니다.
현재 안드로이드 마켓에만 publish돼 있고 게임 카테고리에 있어서 한국에서는 다운 받기 어려울 겁니다. (무료인데.....)
아이폰은 현재 Waiting For Review 상태입니다.


일단 아래와 같이 코딩하세요.

local pingpong = display.newImage("endingblue.png",100,10)
pingpongShape = {   -26.5, 17  ,  -27.5, -55  ,  -25.5, -55  ,  25.5, 16  ,  -18.5, 20  ,  -23.5, 20,
                28.5, -51  ,  34.5, -40  ,  37.5, -27  ,  37.5, -2  ,  27.5, 16  ,  -25.5, -55  ,  24.5, -55
                 }
                 
physics.addBody(pingpong,"dynamic",{density=3.0, friction=0.8, bounce=0.6, shape=pingpongShape})


보시면 다각형이 아주 이상하게 됐죠?
PhysicsEditor로 했는데 제가 사용법을 잘 몰라서 이상하게 됐나봐요.
(혹시 누가 포토샵이나 플래시 아니면 아무 프로그램 이던지.. 이런 좌표 쉽게 알아내는 방법 아시면 알려 주세요.)

어쨌든 다각형을 구현하려면 테이블에 필요한 x,y좌표들을 배열 한 다음에 addBody 의 shape 파라미터에 그 테이블 이름을 대입하시면 됩니다.

이외에 Sensor 라는 개념도 있습니다.
이 센서는 다른 body와 작용을 하지는 않습니다. 다만 collision 이 일어났을 때 그걸 감지할 수 있습니다.

아래 코드를 추가해서 실행해 보세요.
local rect = display.newRect( 50, 50, 100, 100 )
rect:setFillColor( 255, 255, 255, 100 )
rect.isVisible = false  -- optional
physics.addBody( rect, { isSensor = true } )

실행하시면 이 사각형은 보이지 않을 겁니다. (다만 hybrid가 적용되서 오렌지 사각형 영역이 보일겁니다.)
그리고 이 사각형은 다른 모든 body들을 그냥 통과할 것이고 땅으로(밑으로) 꺼져 버리게 될 겁니다.
이 센서 기능도 실제 앱에서 유용하게 사용할 수 있겠죠?
예를 들어 어느 영역(골대)로 가면 튕기지는 않고 통과하지만 점수는 올라가게 한다든지 하는....

addBody를 해제 하려면 아래와 같이 합니다.
myBody:removeSelf()
-- or --
myBody.parent:remove( myBody )
 
body 적용이 필요 없어지게 되면 이렇게 addBody를 해제하면 되겠죠?

끝으로 Body의 프로퍼티들과 메소드 들을 살펴 보겠습니다.

body.isAwake

myBody.isAwake = true
local state = myBody.isAwake
아까 만든 코드를 실행해 보면 박스나 바위 같은게 땅에 튕기다가 완전히 서게 되면 오렌지색이 어둡게 변하게 됩니다.
이렇게 아무런 상호작용이 일어나지 않을 경우 body 는 go to sleep 하게 됩니다.
현재의 isAwake 상태를 볼 수도 있고 true,false 값으로 설정할 수 있습니다.

body.isBodyActive

myBody.isBodyActive = true
local state = myBody.isBodyActive
현재 body의 액티브 상태를 나타냅니다. inactive 상태인 바디는 destroy되지 않습니다. 다만 다른 바디와 상호작용을 할 수는 있습니다.

body.isBullet

이건 바디가 총알로 취급되느냐 안 되느냐라는 거랍니다. 당연히 디폴트는 false구요.
정확한 건 저도 써 보지 않아서 모르겠습니다.

body.isSensor

센서는 아까 설명했듯이 다른 바디들과 상호작용은 안 하지만 충돌 등은 체크할 수 있는 기능입니다. 이 파라미터는 Sensor가 적용 됐는지 안 됐는지 알아볼 수 있습니다.

body.isSleepingAllowed

body가 항상 awake돼 있으면 메모리 차지를 많이 하겠죠? 이건 필요할 때 sleeping모드로 바꿀 수 있으면 바꿔야 할 때 사용 가능하겠네요.

body.isFixedRotation

로테이션이 lock됐는지 안 됐는지 알아 볼 수 있습니다.

body.angularVelocity

myBody.angularVelocity = 50
local v = myBody.angularVelocity
현재 로테이션 속도를 알 수 있습니다. 1초당 몇도 돌아가는지 알려 줍니다.
그리고 로테이션 속도도 설정할 수 있습니다.

body.linearDamping

이건 잘 모르겠는데.... 바디 객체가 얼마나 젖어 있는지 설정하는 건가?

body.botyType

myBody.bodyType = "kinematic"
local currentType = myBody.bodyType
static,dynamic,kinematic 인지 알아 내거나 설정할 수 있는 파라미터 입니다.


TIP : 코로나에서는 파라미터를 사용할 때는 . 를 사용하고 메소드를 사용할 때는 : 를 사용합니다.

Body Methods

body:setLinearVelocity
body:getLinearVelocity

바디의 속도를 set,get 하기 위한 메소드 입니다.
myBody:setLinearVelocity( 2, 4 );  vx, vy = myBody:getLinearVelocity();

body:applyForce
이건 한번도 사용 안해 봐서 잘 모르겠습니다.
myBody:applyForce( 500, 2000, myBody.x, myBody.y )

body:applyTorque

로테이션 force 값을 줄 때 사용합니다. 코로나에서 말하는 force는 뭘까요?
myBody:applyTorque( 100 )

body:applyLinearImpulse
이것도 applyForce랑 비슷하다네요. 아주 거친 느낌을 주는 무엇인거 같은데..

body:applyAngularImpulse

코로나에서 Force 와 Impulse에 대해 비교 설명하고 있네요.
이 두가지가 서로 헛갈리는 개념인가봐요.

impulse는 body에 즉각적으로 kick하고 force는 시간을 두고 영향을 미친다고 하네요.
한번 설정했다고 계속 적용되는 개념들이 아닌가봐요.

이거 익숙해지려면 많이 적용해 봐야겠습니다.

body:resetMassData

===========================

이런 파라미터들과 메소드들이 있답니다.
이 것들과 친해지는건 각자의 몫이구요.

다음시간에는 Physics Joints에 대해 다뤄 보도록 하겠습니다.

감사합니다.

P.S.) 댓글 달아 주시면 강좌 올리는 저도 좀 더 신날 것 같습니다.
         댓글 달아주세요....


오늘 모든 코드파일과 이미지 파일등은 위 압축파일에 담겨 있습니다.
참고하세요.
반응형

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 소개를 해 드렸는데요.

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

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

다음 시간에 뵈요.
반응형