http://www.iforce2d.net/b2dtut/joints-prismatic 를 참고하자.
승강기
이동 발판
여닫이문
피스톤
을 위해 이용한다.
b2PrismaticJointDef prismaticJointDef;
prismaticJointDef.bodyA = bodyA;
prismaticJointDef.bodyB = bodyB;
prismaticJointDef.collideConnected = false;
와 같이 접합점의 기본 설정을 적용하며, 4번째 줄의 기본값은 거짓이다.
localAxis1* - A 강체에 상대적인 이동 축(동선)
referenceAngle - 두 강제간 고정된 상대각
localAnchorA - A 강체 기준으로 축을 위치시킬 점
localAnchorB - B 강체 기준으로 축을 위치시킬 점
enableLimit - 이동 제한 여부
lowerTranslation - 이동 하한점
upperTranslation - 이동 상한점
enableMotor - 모터 활성화 여부
motorSpeed - 목적 최대 이동 속도
maxMotorForce - 모터가 최대로 낼수 있는 출력
* localAxisA 으로 Box2D v2.2.0 버전부터 변경.
prismaticJointDef.localAxis1.Set(0,1); 의 방식으로 동선의 방향을 결정한다. (0,1)과 (0,-1)은 방향은 같다. 그러나 이동시 양의 이동의 경우 전자는 위쪽으로, 후자는 아래쪽으로 방향이 결정된다.
이는 단위 벡터이어야 한다.
prismaticJointDef.localAxis1.Normalize();를 호출한다.
localAnchor는 전에 다룬 것과 마찬가지로 접합점을 위치시킬 좌표로 강체에 상대적이다.
prismaticJointDef.localAnchorA.Set( 6,-3);//a little outside the bottom right corner
prismaticJointDef.localAnchorB.Set(-1,-4);//bottom left corner
다음과 같이 생성한다. ( m_joint는 새로 정의한 클래스 변수)
m_joint = (b2PrismaticJoint*)m_world->CreateJoint( &prismaticJointDef );
ReferenceAngle의 경우 강체 A에 대한 강체 B의 각도를 명시하는 부분이다.
절대 변하지 않는다.
prismaticJointDef.referenceAngle = 5 * DEGTORAD;
제한 또한 걸수 있다.
prismaticJointDef.enableLimit = true;
prismaticJointDef.lowerTranslation = 0;
prismaticJointDef.upperTranslation = 10;
동적으로 변경할 수 있다.//alter joint limits
void EnableLimit(bool enabled);
void SetLimits( float lower, float upper );
//query joint limits
bool IsLimitEnabled();
float GetLowerLimit();
float GetUpperLimit();
이 또한 제한을 허용하면, 두 경계가 모두 활성화된다. 하나만 제한하고자 한다면 다른 하나의 한계치를 접근할 수 없도록 (크게/작게) 값을 설정해야 한다.
상한과 하한을 같은 값으로 두면 고정된다. 같게 유지하면서 이 값을 점차 변경시키면 (모터 없이도)강력히 점차 이동하는 물체를 시연할 수 있다.
역시 매우 빠르게 이동하던 물체가 한계점을 넘을 경우, 이것(물체가)이 Box2D에 의해 위치가 수정되기 전까지 잠깐동안 한계를 벗어난 상황이 나타날 수(잠깐 렌더링 될 수) 있다.
한계점에 있는지에 대한 체크.
bool atLowerLimit = joint->GetJointTranslation() <= joint->GetLowerLimit();
bool atUpperLimit = joint->GetJointTranslation() >= joint->GetUpperLimit();
모터
prismaticJointDef.enableMotor = true;
prismaticJointDef.maxMotorForce = 500;//this is a powerful machine after all...
prismaticJointDef.motorSpeed = 5;//5 units per second in positive axis direction
힘이 적용되며, 최대 속도를 지정한다. 속도가 바로 지정되는 것이 아니므로 지정한 속도로 고정체가 이동한다는 보장이 없다.
동적으로 변경하기.
//alter joint motor
void EnableMotor(bool enabled);
void SetMotorSpeed(float speed);
void SetMaxMotorForce(float force);
//query joint motor
bool IsMotorEnabled();
float GetMotorSpeed();
float GetMotorForce();
목적 속도를 0으로 두면, 브레이크가 된다.
댓글 없음:
댓글 쓰기