2017-08-23 65 views
0

我會得到一些關於人類20個骨架的3d位置(在固定的世界座標系統中)的數據流。實現像kinect層次旋轉

我想使用骨架數據來驅動一個像demo video這樣的固定骨骼的人體模型。

在Kinect SDK v1.8中,我可以通過NUI_SKELETON_BONE_ORIENTATION.hierarchicalRotation獲得每個骨架的局部旋轉。

我想實現這樣的功能,但Kinect的SDK不是開源的。

我發現函數xnGetSkeletonJointOrientation可以像OpenNI那樣得到框架的旋轉。但是我還沒有找到關於這個的實現函數。我不知道我在哪裏錯了。

任何想法表示讚賞。謝謝!

編輯

我已經找到了similar question

這是他最後使用的代碼。

Point3d Controller::calRelativeToParent(int parentID,Point3d point,int frameID){ 
if(parentID == 0){ 
    QUATERNION temp = calChangeAxis(-1,parentID,frameID); 
    return getVect(multiplyTwoQuats(multiplyTwoQuats(temp,getQuat(point)),getConj(temp))); 
}else{ 
    Point3d ref = calRelativeToParent(originalRelativePointMap[parentID].parentID,point,frameID); 
    QUATERNION temp = calChangeAxis(originalRelativePointMap[parentID].parentID,parentID,frameID); 
    return getVect(multiplyTwoQuats(multiplyTwoQuats(temp,getQuat(ref)),getConj(temp))); 
}} 
QUATERNION Controller::calChangeAxis(int parentID,int qtcId,int frameID){ //currentid = id of the position of the orientation to be changed 
if(parentID == -1){ 
    QUATERNION out = multiplyTwoQuats(quatOrigin.toChange,originalRelativePointMap[qtcId].orientation); 
    return out; 
} 
else{ 
    //QUATERNION temp = calChangeAxis(originalRelativePointMap[parentID].parentID,qtcId,frameID); 
    //return multiplyTwoQuats(finalQuatMap[frameID][parentID].toChange,temp); 
    return multiplyTwoQuats(finalQuatMap[frameID][parentID].toChange,originalRelativePointMap[qtcId].orientation); 
}} 

但我仍然有一些關於這個問題。

變量quatOrigin.toChangeoriginalRelativePointMap代表什麼?

,在我看來,參數Point3d point功能Controller::calRelativeToParent應符合歐拉angle.In這樣一個載體,如何調用API Controller::calRelativeToParent在主program.Because我們只知道根的轉動。

回答

0

骨架類有一個「接頭」成員,其中包含骨架上每個跟蹤關節的所有三維位置數據。我會直接查看聯合位置數據來驅動您的模型而不是角度。取一點作爲你的基礎(頭或其他),然後在連接的骨骼點對之間以樹形式生成向量。縮放這些向量並將其應用於您的模型。

+0

對不起,我的「關節」成員是從一些像kinect那樣的設備獲得的,沒有高精度的關節位置。所以我不能通過關節位置來驅動我的模型,我想通過分層方向來驅動它。 – zdczdcc

+0

是的,我只是建議你推導出你自己的層次取向,因爲我不記得你是否可以直接從kinect中獲取。如果您擔心噪音,請對每個點應用低通濾波器。但爲了澄清,我建議你將每個關節進行連接並將它們分組,然後使用這些方向向量來創建您的層次結構。 –

+0

我可以得到每幀20關節,並將其保存到磁盤進行一些測試脫機。關鍵是我不知道如何派生分層orientation.And我想得到一個示例項目進行學習。所以我下載'OpenNI'和'libfreenect'.But我還沒有在這兩個項目中找到相關的代碼。 – zdczdcc