2014년 2월 27일 목요일

[일기]Box2D. 회전시키기.

Box2D. 에서 물체를 회전시키는 것.

직선으로 이동시키는 것과 마찬가지이다.

 직접 각을 지정하는 것.

 pBody->SetTransform( pBody->GetPosition(), 120.0 * 3.141592 / 180.0 );

 선속도와 달리 신경써야할 중요한 것은 자동으로 정해지는 각속도이다. 이는 물체에 힘을 가했을 때 생기게 되므로 위 코드처럼 120 도로 이동을 하고자 했으나 각속도가 있었다면 다음 시연(스텝) 단계에서 회전하게 되어 목적하는 회전각이 나오지 않는다. 따라서

 pBody->SetAngluarVelocity( 0 );

 과 같이 회전각 지정 전, 각속도를 제거해야 한다는 것. 그래야 명시한 각으로 회전해 있다.

 토크를 이용하는 것.

 pBody->ApplyTorque( 100.0, true );

 와 같이 코드를 작성하여 서서히 회전시키는 것. 이 역시 힘이 서서히 가해지므로 목적하는 회전각까지 도달하는데 시간이 걸릴 수 있다.

 역시 주의할 점은, 목적하는 회전각에 근접한 경우로, 이전 시연(스텝) 단계에서 회전각에 매우 근접하였으나 그 값은 아직 미달될 때, 다음 시연(스텝) 단계에서 토크가 가해지고 난 뒤 회전각이 계산된다. 허나 이 회전각은 목적하는 회전각을 초과하는 값을 가질 수 있다. 만일 목적하는 회전각을 넘어서는 경우, 토크를 역방향으로 가하여 조절할 수 있으나 회전각에 도달하지 못하고 그 값을 중심으로 미달되었다가 초과하였다가 하며 진동하는 현상이 올 수 있다.

 이것을 해결하기 위해 고안된 아이디어가 다음 시연(스텝) 단계에서의 회전각이 얼마일지를 예상하여 회전각을 조율하는 것으로 다음 회전각은 현재 각속도의 영향을 받는다는 것에 착안한 것이다.

 float nextAngle = pBody->GetAngle() + pBody->GetAngularVelocity() / 60.0;

 이와 같이 다음 시연(스텝) 단계에서의 회전각을 알아보고 이 결과를 보고(즉, 미래를 예측하여) 토크를 더 적용시킬지, 약하게 적용시킬지를 결정할 수 있다.

 회전 모멘트와 관련된 공식을 이용하는 것. 그니까 공식 이용하는 거.

 물리 법칙 중 하나로 회전 모멘트를 이용한 방법이다.

 float torque = pBody->GetInertia() * targetAngularVelocity / (1/60.0);
 pBody->ApplyTorque( torque, true );

 토크의 크기를 구한 뒤, 적용하는 방식이다. 토크는 전체 질량에 대한 모멘트에 각가속도를 곱한 형태로 정의된다. 즉 T = Ia' 의 형태로 F = ma와 형태가 같다.

 충격량을 적용하는 것.

 전에 논의한 힘과 충격량의 관계와 유사한 방식으로 생각한 방법이다. 역시 시간은 고려하지 않는다.

 float impulse = pBody->GetInertia() * targetAngularVelocity;
 pBody->ApplyAngluarImpulse( impulse );

 어.. 어렵다..

댓글 없음:

댓글 쓰기