CCD(Cyclic Coordinate Descent)是最簡單和最流行的反向運動學方法之一倚舀,已廣泛應用于計算機游戲行業(yè)。主要思想是一次將一個關節(jié)與末端效應器和目標對齊痕貌,迭代地使最后一個骨骼靠近目標。即使應用了旋轉(zhuǎn)限制舵稠,CCD也非常快速可靠室琢。 CCD傾向于過分強調(diào)靠近目標位置的骨骼的旋轉(zhuǎn)(非常長的CCD鏈只會在其目標周圍滾動)。減少層次結(jié)構(gòu)中的骨骼重量將彌補這種影響盈滴。它設計用于處理串行鏈骨骼轿钠,因此,很難擴展到多個末端執(zhí)行器的問題(在這種情況下使用FABRIK)疗垛。完全地擴展鏈條也需要大量的迭代。
每幀監(jiān)視和驗證IK鏈在性能上會很昂貴贷腕,因此在運行時更改骨骼層次結(jié)構(gòu)必須通過在求解器上調(diào)用SetChain(Transform []層次結(jié)構(gòu))來完成。如果層次結(jié)構(gòu)有效瞒斩,則SetChain返回true涮总。 CCD允許直接編輯它的骨骼旋轉(zhuǎn)(雖然不是通過場景視圖函數(shù))胸囱,但是位置不可以編輯妹卿,這意味著您可以編寫一個腳本,每幀都在CCD鏈中旋轉(zhuǎn)骨骼夺克,但您不應該像FABRIK一樣嘗試更改骨骼的位置。但是柬帕,您可以隨意縮放骨骼,CCD不關心骨骼長度陷寝。
使用步驟:
- 將CCDIK組件添加到骨骼鏈中的第一個GameObject
- 將鏈中的所有元素分配給組件中的“Bones”。 父節(jié)點必須設置凤跑,其他可以跳過。
- 按Play仔引,將weight設置為1。
改變目標位置:
public CCDIK ccdIK;
void LateUpdate () {
ccdIK.solver.IKPosition = something;
}
在運行時添加CCDIK:
- 通過腳本添加CCDIK組件
- 調(diào)用CCDIK.solver.SetChain()
使用帶旋轉(zhuǎn)限制的CCD:
只需將一個旋轉(zhuǎn)限制組件(RotationLimitAngle翘簇,RotationLimitHinge儿倒,RotationLimitPolygonal或RotationLimitSpline)添加到已分配給CCDIK組件的“bone”的骨骼上版保。 請注意夫否,每個旋轉(zhuǎn)限制都會降低求解器的穩(wěn)定性和連續(xù)性。 如果CCDIK無法在某些目標位置解決高度約束的鏈袖裕,那很可能不是FinalIK的錯誤曹抬,而是CCD算法的一個根本障礙(記住,沒有IK算法是完美的)堰酿。
組件參數(shù):
- timeStep - 如果為零张足,將更新每個LateUpdate()中的求解器,用于骨骼帶動畫時的情況为牍。 如果大于零,將按頻率更新碉咆,以便求解器將在所有對象上同時到達其目標。
- fixTransforms - 如果為true茂浮,則將解算器使用的所有Transforms修復為每個Update中的初始狀態(tài)。 這可以防止沒有動畫骨骼和animator的剔除的問題席揽,并且性能成本很低。
求解參數(shù):
- target - 目標變換幌羞。 如果已分配,則解算器IKPosition將自動設置為目標的位置属桦。
- weight - 用于平滑地混合IK效果的求解器權(quán)重
- tolerance - 距離最后到達位置的最小距離。 如果與先前到達位置的差異小于容差愁拭,則將停止求解亏吝。 如果容差為零,將迭代直到maxIterations蔚鸥。
- maxIterations - 每幀最大迭代次數(shù)。 如果tolerance為0止喷,則將一直迭代直到maxIterations
- useRotationLimits - 如果為true,將使用附加到骨骼的任何RotationLimit組件
-
bones - 求解程序用于到達目標的骨骼弹谁。 所有骨骼都需要按降序排序(父節(jié)點優(yōu)先)。 可以在層次結(jié)構(gòu)中跳過骨骼沟于,骨骼層次結(jié)構(gòu)不能分支植康,這意味著您無法從雙手分配骨骼旷太。 weight決定了解算器計算時它的權(quán)重销睁。