1.原理解释:
待补充。。。
2.简单实现Demo:
1.搭建简单场景:

2.实现代码:
算法实现分析:
待补充。。。
主要实现代码如下:
cs
void SolveTwoBoneIK()
{
Vector3 targetPosition = target.position;
Vector3 rootPosition = rootBone.position;
float targetDistance = Vector3.Distance(rootPosition, targetPosition);
float chainLength = upperLength + lowerLength;
if (targetDistance >= chainLength)
{
Vector3 direction = (targetPosition - rootPosition).normalized;
middleBone.position = rootPosition + direction * upperLength;
endBone.position = rootPosition + direction * chainLength;
return;
}
// 使用余弦定理计算关节角度
// cos(angle) = (a² + b² - c²) / (2ab)
float upperSqr = upperLength * upperLength;
float lowerSqr = lowerLength * lowerLength;
float targetSqr = targetDistance * targetDistance;
float upperAngle = Mathf.Acos(
Mathf.Clamp(
(upperSqr + targetSqr - lowerSqr) / (2 * upperLength * targetDistance),
-1f, 1f
)
) * Mathf.Rad2Deg;
float middleAngle = Mathf.Acos(
Mathf.Clamp(
(upperSqr + lowerSqr - targetSqr) / (2 * upperLength * lowerLength),
-1f, 1f
)
) * Mathf.Rad2Deg;
Vector3 toBendDirection = Vector3.zero;
if (poleTarget != null)
{
Vector3 toTargetPos = targetPosition - rootPosition;
Vector3 toPole = poleTarget.position - rootPosition;
toBendDirection = Vector3.ProjectOnPlane(toPole, toTargetPos).normalized;
}
else
{
toBendDirection = Vector3.Cross(
targetPosition - rootPosition,
Vector3.up
).normalized;
}
// 5. 应用旋转
Vector3 toTarget = (targetPosition - rootPosition).normalized;
Quaternion upperRotation = Quaternion.LookRotation(toTarget, toBendDirection);
upperRotation *= Quaternion.Euler(-upperAngle, 0, 0);
rootBone.rotation = Quaternion.Lerp(rootBone.rotation, upperRotation, weight);
middleBone.position = rootBone.position + rootBone.forward * upperLength;
Vector3 toEnd = (targetPosition - middleBone.position).normalized;
middleBone.rotation = Quaternion.Lerp(
middleBone.rotation,
Quaternion.LookRotation(toEnd, toBendDirection),
weight
);
endBone.position = Vector3.Lerp(
endBone.position,
targetPosition,
weight
);
}
实现结果:

参考链接:
Unity 3D - Generic Inverse Kinematics (IK) - Open Source - Github (youtube.com)