도르래입니다. 정확한 번역은 모르겠네요. pull이 "당기다"의 의미를 가지고 있으니 대강 비슷한 느낌으로 생각하셔도 될듯합니다. 다른 joint type들에 비해서 조금 특수합니다. body들도 많이 필요하고 anchor들도 많이 필요합니다. joint의 정의 또한 좀 더 복잡한 편이구요.

그래도 도르래가 뭔지 알고있다면 나머지는 definition의 속성들을 바꿔가면서 익힐 수 있으니 그리 어렵지 않게 적을 할 수 있습니다. 말 10마디 하는것보다 직접 보는게 낫더군요.
이번엔 pulley joint 뿐만 아니라 revolute joint도 같이 적용해봤습니다. 저울이죠. 저울의 양쪽에 revolute joint로 균등하게 엮여 있습니다. 

마우스로 허공에 클릭하면 일정한 크기의 상자가 생기구요. '추'라고 가정해봅니다. 저울 양쪽에 추를 올려놓고 무게에 따른 길이 변화를 관찰하는 것이 목적인 예제 입니다. 사실 저울과는 거리가 좀 있죠. 양쪽의 길이 변화가 ratio 값에 따라 영향을 받는듯 합니다. 만들면서 아직 제가 감을 덜 잡은 부분이기도 하구요. ratio에 따른 길이 변화를 좀 더 명확하게 이해시켜주실분이 어디 없을지..

function onClick(event:MouseEvent):void {

createBox(mouseX, mouseY, 30, 30, 0, true);

}


마우스 이벤트 핸들러입니다. 클릭된 위치에 가로 세로 30 크기의 dynamic body를 만들어냅니다.

function createBox(px:Number, py:Number, w:Number, h:Number, angle:Number, isDynamic:Boolean):b2Body;


function createCircle(px:Number, py:Number, r:Number, isDynamic:Boolean):b2Body;


언제나 한결같은 box와 circle 생성함수입니다. 언급만 하고 패스.

function createRevoluteJoint(body1:b2Body, body2:b2Body, anchor:b2Vec2):void

{

var jointDef:b2RevoluteJointDef = new b2RevoluteJointDef();

jointDef.Initialize(body1, body2, anchor);

jointDef.collideConnected = true;

jointDef.enableLimit = false;

jointDef.enableMotor = false;

world.CreateJoint(jointDef);

}


지난번에 다뤘던 revolute joint 생성함수 입니다. 이 예제에서는 limit과 motor 모두 사용하지 않는 부분만 보시면 되겠습니다.

function createScale(px:Number, py:Number, w:Number, h:Number):b2Body

{

var center:b2Body = createCircle(px, py, 5, true);

var flate:b2Body = createBox(px, py+h, w, 10, 0, true);

createRevoluteJoint(flate, center, new b2Vec2((px-w/2)/scale, (py+h)/scale));

createRevoluteJoint(flate, center, new b2Vec2((px+w/2)/scale, (py+h)/scale));

return center;

}


저울의 한쪽 부분을 생성하는 함수입니다. 지정된 위치에 중심 body를 동그랗게 만들고 h만큼 아래쪽에 판을 w만큼 길게 만들어 냅니다. 그리고 그 판의 양쪽 끝을 중심 body랑 각각 revolute joint 로 엮어주죠. 당연히 body들은 모두 dynamic 이겠죠. 안그럼 저울의 의미가 없으니까. 마지막으로 모든 단위는 각 스케일에 맞게 적용되어야 합니다. 픽셀과 미터는 전혀 상관없는 단위니까요.

function createPulleyJoint(body1:b2Body, body2:b2Body, ground1:b2Vec2, ground2:b2Vec2, anchor1:b2Vec2, anchor2:b2Vec2):void

{

var jointDef:b2PulleyJointDef = new b2PulleyJointDef();

jointDef.Initialize(body1, body2, ground1, ground2, anchor1, anchor2, 1);

jointDef.collideConnected = true;

jointDef.maxLengthA = 190;

jointDef.maxLengthB = 190;

world.CreateJoint(jointDef);

}


그리고 이번에 새롭게 만들어진 pulley joint 입니다. body1을 ground1이랑 anchor1을 기준으로 엮어주고 body2는 ground2, anchor2 와 엮어놓으면 두 body들이 pulley joint의 영향을 받게 됩니다. 하지만 양쪽에 할당될 수 있는 길이는 한정되어 있기 때문에 그 최대값을 여유있게 잡아 놓았습니다. 이 예제에서는 기본적으로 100 정도의 높이에 각 저울이 위치하고 무개에 맞게 늘어나고 줄어들되 0보다 작을수 없으며 190보다 커질 수 없게 해두었습니다.

또한 두 저울이 서로 간섭을 할 수 있게 했네요. 사실 좀 떨어진 거리여서 간섭을 만들어도 별다른 차이점이 이 예제에서 찾아보기 힘듭니다만. : )

var ground1:b2Body = createCircle(100, 0, 5, false);

var ground2:b2Body = createCircle(400, 0, 5, false);

var scale1:b2Body = createScale(100, 200, 140, 90);

var scale2:b2Body = createScale(400, 200, 140, 90);


createPulleyJoint(scale1, scale2, ground1.GetWorldCenter(), ground2.GetWorldCenter(), scale1.GetWorldCenter(), scale2.GetWorldCenter());


이 부분이 createPulleyJoint 함수를 사용해서 두 저울을 생성하고 엮어내는 부분입니다. 저는 생성자 함수에서 이 부분을 사용하고 있습니다. anchor 들은 각 body들의 중심점이므로 간편하게 .GetWorldCenter 함수를 통해서 이용하고 있습니다.

'programming > box2d docs' 카테고리의 다른 글

b2PrismaticJoint 예제  (0) 2011.02.01
b2Revolute Joint 예제  (0) 2011.01.30
b2DistanceJoint 예제  (0) 2011.01.28
b2Body 예제 - Box2DFlash  (4) 2011.01.17
Box2DFlash v2.1a Update Notes 비공식 한글문서  (0) 2011.01.16

WRITTEN BY
buzzler

,