2013-06-01 2 views
0

내 응용 프로그램에서는 3D 모델을 사용하여 수동으로 값을 설정하여 회전, 비율 변환이 가능합니다. 또한 주어진 점에서 회전을 추출 할 수도 있습니다. 그래서 각 관절에 4x4 매트릭스를 사용하여 키 프레임을 저장할 수 있습니다.C++의 애니메이션, 회전 행렬로 키 프레임을 보간

그러나 이제는 해당 프레임간에 애니메이션을 적용하려고합니다. 내가 원하는 것 : 은 X 초 내에 프레임 1에서 프레임 2까지 보간합니다. 이 C++에서 어떻게 구현할 수 있습니까 ?? http://www-scf.usc.edu/~amahajan/mocap/mocap4.html과 같은 것을 찾았습니다. 그러나 C++로 이것을 작성하는 데 실마리가 없습니다.

답변

0

괜찮 았는데 ... Eigen 라이브러리에는 이미 Quaternion1.slerp (Quaternion2, float T) 함수가 있습니다. SLERP이 무엇인지 알지 못한다면 : slerp는 하나의 Quaternion과 다른 하나를 보간하고, float T는 얼마나 많은 보간을해야 하는지를 증가로 간주 할 수 있습니다. 예를 들어, slerp에 단위 쿼터니언, Y 90 ° 쿼터니언 및 플로트 T "0.5"값을 지정하면 결과는 Y 45 °의 쿼터니언입니다. slerp에 대한 자세한 내용은 google을 참조하십시오. 당신은 아이겐를 사용하는 경우

, 당신은 단순히 회전 행렬에서 쿼터니온을 할 수 있습니다 :이

Matrix3f m; 
Quaternion<float> q1=m.toRotationMatrix(); 

를 단순히 증가 0.01와 1.00로 0.01에서가는 루프를 만들었습니다. 다른 스레드에서이 작업을 수행해야합니다.

for(double i=0.0;i<1.0;i=i+0.01) 
    { 
     //let this thread sleep for 10 millisec, this gives us a 100hertz rate 
     //with this, the whole animation is over in 1 second 
     boost::this_thread::sleep(boost::posix_time::millisec(10)); 
     //q1= first frame, q2 = second frame 
     Quaternion<float> q3(q1.slerp(i,q2)); 
     //now apply the quaternion 
     // for each "bone", or node you need to apply a SLERPed quaternion 
     m_node->setRotation(q3.toRotationMatrix()); 
    }