2014-01-27 39 views
1

我實現了逆運動學的CCD算法,它工作的很好,但是因爲約束失敗,我想實現一個系統,如果手臂無法到達目標,它會嘗試靠近到它。對關節角度有約束的最佳逆運動學算法

我試圖把約束條件放在CCD算法中,也就是說,如果我的旋轉角度高於或低於約束條件,我將它限制爲max或min。例如,如果旋轉角度爲100度,約束爲90,那麼我旋轉90度,並基於該角度計算其他角度,它適用於某些情況,但大多數情況下失敗。

CAn有人告訴我一個3D IK算法,它處理約束?

+0

有沒有我可以使用的任何IK庫? –

回答

3

CCD本身就像魅力一樣工作。 如果您正在使用3D,請首先找到您應該在每個軸上執行的旋轉,而不應用骨骼限制。

之後,該方法

expectedRotation.X = min(expectedRotation.X, maxLimit.X) 
expectedRotation.X = max(expectedRotation.X, minLimit.X) 
expectedRotation.Y = min(expectedRotation.Y, maxLimit.Y) 
expectedRotation.Y = max(expectedRotation.Y, minLimit.Y) 
expectedRotation.Z = min(expectedRotation.Z, maxLimit.Z) 
expectedRotation.Z = max(expectedRotation.Z, minLimit.Z) 

是錯誤。因爲,如果你不能進一步在一個軸上移動,另外兩個軸將繼續移動,你會得到奇怪的結果。

的修復:

如果任何一個3個錯配限額的約束,必須根本改變旋轉。

首先將所有角度轉換爲-180至180格式的度數。那麼下面將做

vector3df angleDifference = expectedRotation - baseRotation; //baseRotation is just the initial rotation from which the bone limits are calculated. 

if(angleDifference.X < boneLimits.minRotation.X || angleDifference.Y < boneLimits.minRotation.Y || angleDifference.Z < boneLimits.minRotation.Z || angleDifference.X > boneLimits.maxRotation.X || angleDifference.Y > boneLimits.maxRotation.Y || angleDifference.Z > boneLimits.maxRotation.Z) 
    return currentRotation; 

return expectedRotation;