2014년 3월 5일 수요일

[일기] Box2D, prismatic joint. 연습.

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으로 두면, 브레이크가 된다.

댓글 없음:

댓글 쓰기