在我的應用程序中,我有一個3D模型,我可以通過手動設置值來旋轉,縮放,翻譯。我也可以提取給定點處的旋轉。所以我現在可以存儲關鍵幀,每個關節都有4x4矩陣。C++中的動畫,插值旋轉矩陣的關鍵幀
但是,現在我想在這些幀之間進行動畫處理。 我想要什麼: 在X秒內插入幀1到幀2。我怎樣才能在C++中實現這個? 我發現像http://www-scf.usc.edu/~amahajan/mocap/mocap4.html ...但我不知道如何寫在c + +
在我的應用程序中,我有一個3D模型,我可以通過手動設置值來旋轉,縮放,翻譯。我也可以提取給定點處的旋轉。所以我現在可以存儲關鍵幀,每個關節都有4x4矩陣。C++中的動畫,插值旋轉矩陣的關鍵幀
但是,現在我想在這些幀之間進行動畫處理。 我想要什麼: 在X秒內插入幀1到幀2。我怎樣才能在C++中實現這個? 我發現像http://www-scf.usc.edu/~amahajan/mocap/mocap4.html ...但我不知道如何寫在c + +
好吧我解決了這個...特徵庫已經Quaternion1.slerp(Quaternion2,float T)函數。如果你不知道SLERP是什麼:slerp在一個四元數與另一個四元數之間插值,浮點數T可以被認爲是增量,它應該插入多少。例如:如果給slerp一個單位四元數,一個Y 90°四元數,浮點數T爲一個「0.5」值,則結果是一個四元數,Y 45°。有關斯萊普的詳細信息,您應該谷歌它,這是衆所周知的。
如果使用本徵,你可以簡單地讓四元數出旋轉矩陣:
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());
}