CCD(Cyclic Coordinate Descent)是最簡(jiǎn)單和最流行的反向運(yùn)動(dòng)學(xué)方法之一,已廣泛應(yīng)用于計(jì)算機(jī)游戲行業(yè)。主要思想是一次將一個(gè)關(guān)節(jié)與末端效應(yīng)器和目標(biāo)對(duì)齊,迭代地使最后一個(gè)骨骼靠近目標(biāo)。即使應(yīng)用了旋轉(zhuǎn)限制,CCD也非??焖倏煽?。 CCD傾向于過(guò)分強(qiáng)調(diào)靠近目標(biāo)位置的骨骼的旋轉(zhuǎn)(非常長(zhǎng)的CCD鏈只會(huì)在其目標(biāo)周圍滾動(dòng))。減少層次結(jié)構(gòu)中的骨骼重量將彌補(bǔ)這種影響。它設(shè)計(jì)用于處理串行鏈骨骼,因此,很難擴(kuò)展到多個(gè)末端執(zhí)行器的問(wèn)題(在這種情況下使用FABRIK)。完全地?cái)U(kuò)展鏈條也需要大量的迭代。
每幀監(jiān)視和驗(yàn)證IK鏈在性能上會(huì)很昂貴,因此在運(yùn)行時(shí)更改骨骼層次結(jié)構(gòu)必須通過(guò)在求解器上調(diào)用SetChain(Transform []層次結(jié)構(gòu))來(lái)完成。如果層次結(jié)構(gòu)有效,則SetChain返回true。 CCD允許直接編輯它的骨骼旋轉(zhuǎn)(雖然不是通過(guò)場(chǎng)景視圖函數(shù)),但是位置不可以編輯,這意味著您可以編寫(xiě)一個(gè)腳本,每幀都在CCD鏈中旋轉(zhuǎn)骨骼,但您不應(yīng)該像FABRIK一樣嘗試更改骨骼的位置。但是,您可以隨意縮放骨骼,CCD不關(guān)心骨骼長(zhǎng)度。
使用步驟:
- 將CCDIK組件添加到骨骼鏈中的第一個(gè)GameObject
- 將鏈中的所有元素分配給組件中的“Bones”。 父節(jié)點(diǎn)必須設(shè)置,其他可以跳過(guò)。
- 按Play,將weight設(shè)置為1。
改變目標(biāo)位置:
public CCDIK ccdIK;
void LateUpdate () {
ccdIK.solver.IKPosition = something;
}
在運(yùn)行時(shí)添加CCDIK:
- 通過(guò)腳本添加CCDIK組件
- 調(diào)用CCDIK.solver.SetChain()
使用帶旋轉(zhuǎn)限制的CCD:
只需將一個(gè)旋轉(zhuǎn)限制組件(RotationLimitAngle,RotationLimitHinge,RotationLimitPolygonal或RotationLimitSpline)添加到已分配給CCDIK組件的“bone”的骨骼上。 請(qǐng)注意,每個(gè)旋轉(zhuǎn)限制都會(huì)降低求解器的穩(wěn)定性和連續(xù)性。 如果CCDIK無(wú)法在某些目標(biāo)位置解決高度約束的鏈,那很可能不是FinalIK的錯(cuò)誤,而是CCD算法的一個(gè)根本障礙(記住,沒(méi)有IK算法是完美的)。

組件參數(shù):
- timeStep - 如果為零,將更新每個(gè)LateUpdate()中的求解器,用于骨骼帶動(dòng)畫(huà)時(shí)的情況。 如果大于零,將按頻率更新,以便求解器將在所有對(duì)象上同時(shí)到達(dá)其目標(biāo)。
- fixTransforms - 如果為true,則將解算器使用的所有Transforms修復(fù)為每個(gè)Update中的初始狀態(tài)。 這可以防止沒(méi)有動(dòng)畫(huà)骨骼和animator的剔除的問(wèn)題,并且性能成本很低。
求解參數(shù):
- target - 目標(biāo)變換。 如果已分配,則解算器IKPosition將自動(dòng)設(shè)置為目標(biāo)的位置。
- weight - 用于平滑地混合IK效果的求解器權(quán)重
- tolerance - 距離最后到達(dá)位置的最小距離。 如果與先前到達(dá)位置的差異小于容差,則將停止求解。 如果容差為零,將迭代直到maxIterations。
- maxIterations - 每幀最大迭代次數(shù)。 如果tolerance為0,則將一直迭代直到maxIterations
- useRotationLimits - 如果為true,將使用附加到骨骼的任何RotationLimit組件
-
bones - 求解程序用于到達(dá)目標(biāo)的骨骼。 所有骨骼都需要按降序排序(父節(jié)點(diǎn)優(yōu)先)。 可以在層次結(jié)構(gòu)中跳過(guò)骨骼,骨骼層次結(jié)構(gòu)不能分支,這意味著您無(wú)法從雙手分配骨骼。 weight決定了解算器計(jì)算時(shí)它的權(quán)重。
CCD組件
